При использовании оператора 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?
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?))
Вместо того, чтобы возвращать 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
Похожие вопросы
Связанные вопросы
Новые вопросы
vb.net
Visual Basic.NET (VB.NET) - это мультипарадигмальный, управляемый, типобезопасный, объектно-ориентированный язык компьютерного программирования. Наряду с C # и F # это один из основных языков, нацеленных на .NET Framework. VB.NET можно рассматривать как эволюцию Microsoft Visual Basic 6 (VB6), но реализованную в Microsoft .NET Framework. НЕ ИСПОЛЬЗУЙТЕ этот тег для вопросов VB6, VBA или VBScript.