Почему мне присваивается Nothing
значение типа в VB.NET:
Dim x as Integer = Nothing
Но мне не разрешено назначать null
в С#:
int x = null;
Почему мне присваивается Nothing
значение типа в VB.NET:
Dim x as Integer = Nothing
Но мне не разрешено назначать null
в С#:
int x = null;
При назначении Nothing
типу значения в VB.Net он создает этот тип с его значением по умолчанию. Таким образом, в этом случае вы не создаете нулевое целое число, а целое число, которое содержит значение по умолчанию 0
Эквивалентный код С# выглядит следующим образом:
int x;
x = default(int);
Обратите внимание, что для ссылочных типов все равно сохраняется:
Dim y As Object
y = Nothing
Этот код VB.Net будет выглядеть так, если он отображается непосредственно на С#:
object y;
y = default(object);
Просто приятно, что значение по умолчанию для object
(или любого другого ссылочного типа) в .Net равно null
. Таким образом, мы видим, что VB.Net Nothing
не является прямым аналогом С# null
, по крайней мере, когда используется со значениями типов.
Интересный пример из спецификации языка: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=01eee123-f68c-4227-9274-97a13d7cb433&displaylang=en
7.1.1 Типы недопустимых значений Для типов значений a? модификатор может быть добавлен к типу имени для представления нулевой версии этого типа. Тип с нулевым значением может содержать те же значения, что и версия с нулевым значением типа, а также нулевое значение. Таким образом, для типа значения NULL присваивание Nothing переменной типа устанавливает значение переменной в нулевое значение, а не нулевое значение типа значения. Например:
Dim x As Integer = Nothing
Dim y As Integer? = Nothing
' Prints zero
Console.WriteLine(x)
' Prints nothing (because the value of y is the null value)
Console.WriteLine(y)
О Nothing
из спецификаций VB.NET(v.10):
Ничто не является специальным литералом; он не имеет типа и конвертируемый ко всем типам типа системы, включая параметры типа. При преобразовании в определенный тип, это эквивалент значения по умолчанию значение этого типа.
из спецификаций С# (v4)
Нулевой литерал может быть неявным преобразуется в ссылочный тип или тип с нулевым значением.
Итак, С# null не может быть неявно преобразован в типы значений, но VB.NET Ничто не может.
Однако настройка x = Nothing
запутанна, потому что на первый взгляд не ясно, что эквивалентно x = 0
.
Особенно, когда ожидается, что Nothing
будет недопустимым значением, а 0
- действительным, это назначение может привести к недоразумениям или даже неявным ошибкам в коде VB.NET.
Вот интересная статья о VB.NET и Nothing vs. Null. Небольшая выдержка:
... типы значений, не могут сравниваться с Nothing или Null. Типы значений - такие типы, как целые и байтовые. Справочник по языку Visual Basic:
Тип значения не может удерживать значение Nothing и возвращаться к его значение по умолчанию, если вы назначаете Ничего. Если вы укажете значение введите Expression, IsNothing always возвращает False.