dim val1 As Integer? = If(5 > 2, Nothing, 43)
" val1 = 0
dim val1 As Integer? = If(5 > 2, Nothing, Nothing)
" val1 = Nothing
Какво дава? Дали това е грешка, или съм пренебрегнал нещо?
Отговори:
13 за отговор № 1Проблемът е, че 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))
Чрез изрично създаване на фалшивия клон на оператора an Integer?
, Nothing
в истинския клон ще представлява нулевата стойност, вместо по подразбиране Integer
стойност.