There's no implicit conversion from Nullable<bool>
to bool
. There is an implicit conversion from bool
to Nullable<bool>
and that's what happens (in language terms) to each of the bool constants in the first version. The bool operator==(Nullable<bool>, Nullable<bool>
operator is then applied. (This isn't quite the same as other lifted operators - the result is just bool
, not Nullable<bool>
.)
In other words, the expression 'fred == false' is of type bool
, whereas the expression 'fred' is of type Nullable<bool>
hence you can't use it as the "if" expression.
EDIT: To answer the comments, there's never an implicit conversion from Nullable<T>
to T
and for good reason - implicit conversions shouldn't throw exceptions, and unless you want null
to be implicitly converted to default(T)
there's not a lot else that could be done.
Also, if there were implicit conversions both ways round, an expression like "nullable + nonNullable" would be very confusing (for types that support +, like int
). Both +(T?, T?) and +(T, T) would be available, depending on which operand were converted - but the results could be very different!
I'm 100% behind the decision to only have an explicit conversion from Nullable<T>
to T
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…