Ошибка ?? Если вы присваиваете значение обнуляемому целому числу через троичный оператор, оно не может стать нулевым - PullRequest
2 голосов
/ 24 августа 2011
dim val1 As Integer? = If(5 > 2, Nothing, 43)
' val1 = 0

dim val1 As Integer? = If(5 > 2, Nothing, Nothing)
' val1 = Nothing

Что дает?Это ошибка, или я что-то упускаю?

1 Ответ

13 голосов
/ 25 августа 2011

Проблема в том, что Nothing в VB.NET работает иначе, чем, например, null в C #.Когда Nothing используется в контексте типа значения (например, Integer), оно представляет значение по умолчанию этого типа.В данном случае это 0.

В первом примере обе ветви троичного оператора имеют допустимые значения Integer.Истинная ветвь представляет 0, а ложная ветвь представляет 43.

Во втором примере ни одна ветвь тернарного оператора не является допустимым значением Integer, что заставляет компилятор VB.NET предполагать, что общий операторвозвращает Object, а не Integer.

Чтобы первый пример работал так, как вы задумали, вам необходимо дать понять компилятору, что троичный оператор должен разрешать Integer?, а неInteger или Object.Вы можете сделать это следующим образом:

dim val1 As Integer? = If(5 > 2, Nothing, New Integer?(43))

Явно сделав ложную ветвь оператора Integer?, Nothing в истинной ветви будет представлять нулевое значение вместо значения по умолчанию Integer значение.

...