Подтвердить что ты не робот

Почему вы можете назначить Nothing Integer в VB.NET?

Почему мне присваивается Nothing значение типа в VB.NET:

Dim x as Integer = Nothing

Но мне не разрешено назначать null в С#:

int x = null;
4b9b3361

Ответ 1

При назначении Nothing типу значения в VB.Net он создает этот тип с его значением по умолчанию. Таким образом, в этом случае вы не создаете нулевое целое число, а целое число, которое содержит значение по умолчанию 0

Ответ 2

Эквивалентный код С# выглядит следующим образом:

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, по крайней мере, когда используется со значениями типов.

Ответ 3

Интересный пример из спецификации языка: 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)

Ответ 4

О Nothing из спецификаций VB.NET(v.10):

Ничто не является специальным литералом; он не имеет типа и конвертируемый ко всем типам типа системы, включая параметры типа. При преобразовании в определенный тип, это эквивалент значения по умолчанию значение этого типа.

из спецификаций С# (v4)

Нулевой литерал может быть неявным преобразуется в ссылочный тип или тип с нулевым значением.

Итак, С# null не может быть неявно преобразован в типы значений, но VB.NET Ничто не может.

Однако настройка x = Nothing запутанна, потому что на первый взгляд не ясно, что эквивалентно x = 0.

Особенно, когда ожидается, что Nothing будет недопустимым значением, а 0 - действительным, это назначение может привести к недоразумениям или даже неявным ошибкам в коде VB.NET.

Ответ 5

Вот интересная статья о VB.NET и Nothing vs. Null. Небольшая выдержка:


... типы значений, не могут сравниваться с Nothing или Null. Типы значений - такие типы, как целые и байтовые. Справочник по языку Visual Basic:

Тип значения не может удерживать значение Nothing и возвращаться к его значение по умолчанию, если вы назначаете Ничего. Если вы укажете значение введите Expression, IsNothing always возвращает False.