Why do nullable bools not allow if(nullable) but do allow if(nullable == true)?

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.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)