/ / Буболечка?? Ако присвоите стойност на цяло число, което може да бъде премахнато чрез троен оператор, то не може да стане null - vb.net, nullable, ternary-operator

Буболечка?? Ако присвоите стойност на нулево цяло число чрез троен оператор, то не може да стане null - vb.net, nullable, ternary-operator

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 стойност.