Предположительно, это происходит потому, что Nothing
в VB.NET это не совсем то же самое, как null
в C#.
В случае типов значений Nothing
подразумевает значение по умолчанию этого типа. В случае Boolean
значением по умолчанию является False
, поэтому листинг преуспевает.
Одно из основных различий между типами значений, такими как Integer или структуры, и ссылочными типами, такими как Form или String, является то, что ссылочные типы поддерживают нулевое значение. То есть переменная ссылочного типа может содержать значение Nothing, а это означает, что переменная фактически не ссылается на значение. Напротив, переменная типа значения всегда содержит значение. Целочисленная переменная всегда содержит число, даже если это число равно нулю. Если вы присваиваете значение Nothing переменной типа значения, переменной типа значения присваивается ее значение по умолчанию (в случае Integer это значение по умолчанию равно нулю). В текущем CLR нет способа посмотреть переменную Integer и определить, было ли ей никогда не назначено значение - тот факт, что он содержит ноль, не обязательно означает, что ему не было присвоено значение.
- The Truth about Nullable Types and VB...
РЕДАКТИРОВАТЬ: Для дальнейшего уточнения, причина второй пример бросает NullReferenceException
во время выполнения происходит потому, что CLR пытается распаковывать в Object
(ссылочный тип), чтобы a Boolean
. Это не может, конечно, так как объект был инициализирован с нулевой ссылки (установив его равным Nothing
):
Dim obj As Object = Nothing
Помните, что, как я уже говорил выше, VB.NET ключевого слова Nothing
все еще работает так же, как null
в C#, когда речь идет о ссылочных типах. Это объясняет, почему вы получаете NullReferenceException
, потому что объект, который вы пытаетесь выполнить, буквально является пустой ссылкой. Он не содержит значения вообще и поэтому не может быть распакован в Boolean
.
Вы не видите того же поведения, когда пытаетесь применить ключевое слово Nothing
к булевому, т.е.:
Dim b As Boolean = DirectCast(Nothing, Boolean)
, потому что ключевое слово Nothing
(на этот раз, в случае типов значений) просто означает «значение по умолчанию этого типа». В случае Boolean
это False
, поэтому литье является логичным и простым.
Некоторые ответы здесь относятся к фреймворку 2.0, это около 3,5. существует нулевой тип в 3.5 для VB – Fredou
@Fredou: ответ на этот вопрос не зависит от конкретной версии Framework, а типы с нулевым значением не являются решением. Ответчик не ищет * решение *, а вместо * объяснения *, почему код ведет себя так же, как и он. –