Это просто система типов 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)
хорош, так как он такжедобавляет ясности вашему коду, легче понять, что вы действительно проверяете.