Почему null не оценивается как false? - PullRequest
23 голосов
/ 07 июля 2010

По какой причине null не оценивается в false в условных выражениях?

Сначала я подумал о назначениях, чтобы избежать ошибки использования = вместо ==, но это может быть легко запрещено компилятором.

if (someClass = someValue) // cannot convert someClass to bool. Ok, nice

if (someClass) // Cannot convert someClass to bool. Why?

if (someClass != null) // More readable?

Я думаю, что вполне разумно предположить, что null означает false. Есть и другие языки, которые используют это тоже, и у меня не было ошибки из-за этого.

Редактировать: И я, конечно, имею в виду ссылочные типы.

Хороший комментарий Дэниела Эрвикера об ошибке назначения ... Это компилируется без предупреждения, потому что оно оценивается как bool:

bool bool1 = false, bool2 = true;
if (bool1 = bool2)
{
    // oops... false == true, and bool1 became true...
}

Ответы [ 11 ]

1 голос
/ 07 июля 2010

Это просто система типов c # по сравнению с такими языками, как PHP, Perl и т. Д.

Условие принимает только значения Boolean, значение null не имеет типа Boolean, поэтому оно не работаеттам.

Что касается примера NULL в C / C ++, который вы упомянули в другом комментарии, нужно сказать, что ни C, ни C ++ не имеют логического типа (в действительности C ++ обычно имеет тип-тип для bool, который разрешается в int, но это другое дело) и у них также нет нулевых ссылок, только NULL (=> 0) -поинтеры.

Конечно, разработчики компилятора могут реализовать автоматическое преобразование любого типа, допускающего обнуляемость, в логический, но это будетвызвать другие проблемы, например:

Предполагая, что foo является не null:

if (foo)
{
  // do stuff
}

Какое состояние foo является истинным?
Всегда, еслиэто не нуль?
Но что, если вы хотите, чтобы ваш тип был конвертируемым в логический (то есть из вашего класса с тремя состояниями или квантовой логики)?

Это означало бы, что у вас будет два разных преобразования в boolнеявное иявное, которое будет вести себя по-разному.

Я даже не смею себе представить, что произойдет, если вы сделаете

if (!!foo) // common pattern in C to normalize a value used as boolean,
           // in this case might be abused to create a boolean from an object
{
}

Я думаю, что принудительный (foo == null) хорош, так как он такжедобавляет ясности вашему коду, легче понять, что вы действительно проверяете.

...