Предположительно, это потому, что Nothing
в VB.NET - это не то же самое, что null
в C #.
В случае типов значений Nothing
подразумевает значение по умолчанию этого типа. В случае Boolean
значением по умолчанию является False
, поэтому приведение выполнено успешно.
Одним из основных различий между типами значений, такими как Integer или структурами, и ссылочными типами, такими как Form или String, является то, что ссылочные типы поддерживают нулевое значение. То есть переменная ссылочного типа может содержать значение Nothing, что означает, что переменная на самом деле не ссылается на значение. Напротив, переменная типа value всегда содержит значение. Целочисленная переменная всегда содержит число, даже если это число равно нулю. Если вы присвоите значение Nothing переменной типа значения, переменной типа значения просто будет присвоено значение по умолчанию (в случае Integer это значение по умолчанию равно нулю). В текущем CLR нет способа просмотреть переменную Integer и определить, не было ли ей присвоено значение - тот факт, что она содержит ноль, не обязательно означает, что ей не было присвоено значение.
- Правда о обнуляемых типах и VB ...
РЕДАКТИРОВАТЬ : Для дальнейшего пояснения причина, по которой второй пример выбрасывает NullReferenceException
во время выполнения, заключается в том, что CLR пытается распаковать Object
(ссылочный тип) в 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
, поэтому приведение является логичным и простым.