Нет неявного преобразования из Nullable<bool>
в bool
. - это неявное преобразование из bool
в Nullable<bool>
, и именно это происходит (в языковых терминах) с каждой из констант bool в первой версии. Затем применяется оператор bool operator==(Nullable<bool>, Nullable<bool>
. (Это не совсем то же самое, что другие операторы отмены - результат просто bool
, а не Nullable<bool>
.)
Другими словами, выражение 'fred == false' имеет тип bool
, тогда как выражение 'fred' имеет тип Nullable<bool>
, следовательно, вы не можете использовать его как выражение "if".
РЕДАКТИРОВАТЬ: Чтобы ответить на комментарии, никогда не существует неявного преобразования из Nullable<T>
в T
и по уважительной причине - неявные преобразования не должны вызывать исключения, и если вы не хотите, чтобы null
неявно преобразовывалось в default(T)
не так много всего можно сделать.
Кроме того, если бы были неявными преобразованиями в обе стороны, выражение типа "nullable + nonNullable" было бы очень запутанным (для типов, которые поддерживают +, например, int
). Оба + (T ?, T?) И + (T, T) будут доступны, в зависимости от того, какой операнд был преобразован - но результаты могут быть очень разными!
Я на 100% за решение иметь только явное преобразование из Nullable<T>
в T
.