При использовании оператора If (http://msdn.microsoft.com/en-us/library/bb513985 (v = VS.100) .aspx), чтобы присвоить значение объекту System.Nullable . , если результатом является Nothing (null), то объекту присваивается 0.

Примере:

'Expected value is null (Nothing). Actual value assigned is 0.
Dim x As System.Nullable(Of Integer) = If(1 = 0, 1, Nothing) 

Если x является типом, допускающим значение NULL, почему ему назначается целочисленный тип по умолчанию, равный 0. Разве он не должен получать значение NULL?

3
DCNYAM 30 Авг 2011 в 19:49

2 ответа

Лучший ответ

Nothing в контексте типа значения преобразуется в значение по умолчанию для этого типа. Для целого числа это просто 0.

Оператор If не выполняет никаких преобразований между своими типами аргументов, все они обрабатываются одинаково - как Integer в вашем случае. Следовательно, ваш код такой же, как

Dim x As Integer? = If(1 = 0, 1, 0)

Чтобы сделать результат допускающим значение NULL, необходимо сделать типы явными.

Dim x As Integer? = If(1 = 0, 1, CType(Nothing, Integer?))
4
Konrad Rudolph 30 Авг 2011 в 15:56

Вместо того, чтобы возвращать Nothing как Integer? Просто создать новое целое число? и верните его.

Кроме того, имейте в виду, что при работе с типами, допускающими значение NULL, вы всегда должны использовать методы .Value, .HasValue и .GetValueOrDefault для Nullable (Of T), а не просто возвращать объект. Таким образом, в вашем случае значение X действительно равно 0, но если вы проверите свойство HasValue, оно должно вернуть False, чтобы указать на нулевую ситуацию. Точно так же, если вы хотите проверить If x = Nothing, он вернет False, но If x.HasValue = False вернет True.

Вы также можете написать свой пример, который работает правильно:

Dim x as Integer? = If(1=0, 1, new Integer?)
Console.WriteLine(x)
Console.WriteLine(x.HasValue)

Выходы: null False

3
Jim Wooley 30 Авг 2011 в 16:49