[Mono-list] Differing nullable behavior

Robert Jordan robertj at gmx.net
Fri Aug 4 16:10:41 EDT 2006


Pedro Sobota wrote:
> You are right. In this case, I don't get why csc lets the use of 'as' 
> with a nullable value type, if a conventional value type is not 
> supported. Should gmcs act like csc, or be coherent?

Please file a bug.

> Unrelated but there is also this curious case where:
> static T CheckDBNull<T>(object value) {
>     if (value is DBNull) return (T)null; else return (T)value;
> }
> is not allowed, but
> static T CheckDBNull<T>(object value) {
>     return (T)((value is DBNull) ? null : value);
> }
> is, on both compilers!

It's not curious at all:

 From the C# spec, (§20.1.1)

"The literal null cannot be converted to a type given by a type 
parameter, except if the type parameter is known to be a reference type 
(§‎20.7.4). However, a default value expression (§‎20.8.1) can be used 
instead. In addition, a value with a type given by a type parameter can 
be compared with null using == and != (§‎20.8.4) unless the type 
parameter has the value type constraint (§‎20.7.4)."

You might argue that the latter test case could fall
under this rule, but it doesn't because the ternary
expression (like every other complex expression)
hides the literal null.


More information about the Mono-list mailing list