Проблема в том, что 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
значение.