2012-04-19 2 views
5

Можно создать дубликат:
Bug?? If you assign a value to a nullable integer via a ternary operator, it can't become nullЧто такое эквивалент VB.NET ключевого слова по умолчанию C#?

Хотя этот вопрос может показаться дубликата многих, это на самом деле спрашивают по определенной причине. Возьмите этот код, например:

Dim n As Integer? = If(True, Nothing, 1) 

В этом коде, тройное выражение должны быть возвращающимся Ничего, но это настройка п 0. Если это C#, я мог бы сказать default(int?) и он будет работать отлично. Теперь похоже, что мне придется вырвать тройку и использовать обычный блок If, но я действительно хочу использовать тройной.

Если ничто не было действительно эквивалентом VB.NET по умолчанию для C#, как вы можете объяснить это поведение?

+0

«Ничего» в этом экземпляре не соответствует 'default (int)', потому что ваш предполагаемый тип на основе выражения 'int', а не' int? '. Это можно увидеть с помощью 'If (true, Nothing, new Integer? (1))' – Marc

+0

Итак, можно с уверенностью сказать, что VB.NET * не имеет эквивалента C# по умолчанию. Если бы это было так, он мог бы использовать вывод типа, чтобы определить, что Nothing в этом случае равно значению по умолчанию для значения NULL-значения, которое равно Nothing, а не 0. – oscilatingcretin

+0

Косвенным образом это правильно. В C# значение 'default' принимает тип, который можно использовать для inferrence. В VB кажется, что 'Nothing' играет пассивную роль в этом. – Marc

ответ

6

VB.NET эквивалент default C# - это ключевое слово Nothing. Код, который вы написали, должен компилироваться просто отлично, пока Id.Value возвращает значение Integer.

Причина, по которой ваш обновленный образец идет не так, объясняется природой Nothing. В VB.NET Nothing - пустое значение и оно конвертируется в любой тип. Теперь для выражения If компилятор должен указать, каков тип возвращаемого значения, и он делает это, просматривая два аргумента значения.

Значение Nothing не имеет типа, но буквально 1 имеет тип Integer. Nothing конвертируется в Integer, поэтому компилятор определяет Integer - лучший тип здесь. Это означает, что в качестве значения выбрано Nothing, оно будет интерпретировано как Integer, а не Integer?.

Самый простой способ исправить это - прямо указать компилятору, что вы хотите, чтобы 1 рассматривался как Integer?.

Dim n As Integer? = If(True, Nothing, CType(1, Integer?)) 
+0

В моем вопросе я правильно использую Nothing в тройном выражении? Если нет, как бы вы изменили его, чтобы делать то, что я пытаюсь? Вы случайно попытались воспроизвести проблему, используя свой собственный код? – oscilatingcretin

+0

@oscilatingcretin код, который вы используете, просто отлично. Я написал образец локально и работал как ожидалось – JaredPar

+0

Итак, попробуйте обновленный код, который я редактировал в свой вопрос. Когда вы запускаете эту единственную строку кода, 'n' устанавливается в Nothing, как ожидалось? Когда я запускаю его, он устанавливается на 0. – oscilatingcretin

Смежные вопросы