почему я должен явно задавать вопрос: истинно ли допустимое логическое значение переменной? - PullRequest
2 голосов
/ 10 февраля 2011
bool? nullableVar;
if(nullableVar) 

выдает ошибку, но

if(nullableVar==true) 

оценивает нормально.

Не уверен, что я понимаю, почему это так, что, если бы bool не обнулялся, все было бы хорошо?

Ответы [ 7 ]

4 голосов
/ 10 февраля 2011

Условное выражение для if должно быть неявно преобразовано в bool.Nullable<bool> не конвертируется в bool, но второе выражение уже уже имеет тип bool, так что все в порядке.Глядя на IL, я считаю, что второе выражение действительно компилируется в:

if (nullableVar.GetValueOrDefault())
4 голосов
/ 10 февраля 2011

Запись if (nullableVar) попытается неявно преобразовать bool? в bool. (Потому что if с требуют bool с)

Поскольку не существует неявного преобразования из T? в T, вы не можете этого сделать.

Обратите внимание, что вы также можете написать

if (nullableVar ?? false)
1 голос
/ 10 февраля 2011

Nullable<T> только явно конвертируется в T. В вашем случае ваш bool? только явно конвертируется в bool. Здесь вы пытаетесь сделать неявное преобразование (явное преобразование требует приведения к нужному типу, а неявное - нет).

Ваше сравнение - это выражение, которое приводит к bool, поэтому оно разрешено.

0 голосов
/ 10 февраля 2011

A bool? (например, nullableVar) может иметь три различных значения: true , false или null .

if(nullableVar) неоднозначно, когда nullableVar равно ноль .

if(nullableVar==true) явно ложно , когда nullableVar равно ноль .

0 голосов
/ 10 февраля 2011

Поскольку == использует вызов перегрузки Equals, тогда как if() ожидает, что выражение будет bool (или, как сказал Джон Скит, неявно преобразуемое в bool).

0 голосов
/ 10 февраля 2011

допустимый для типа bool может иметь 3 различных значения: true, false или null

bool? myNullableBool;
if (myNullableBool == false)
...

необнуляемый bool может иметь только 2 значения: true или false

bool myBool;
if (myBool)
...
0 голосов
/ 10 февраля 2011

Предложение if должно быть логического типа. Нуль не является логическим типом. Производя сравнение, вы создаете выражение с логическим результатом.

...