使用 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是可空类型,为什么它被赋值为0的默认整数类型。它不应该接收null值吗?
答案 0 :(得分:4)
Nothing
解析为该类型的默认值。对于整数,这只是0
。
If
运算符不会在其参数类型之间进行任何转换,它们都被平等对待 - 在您的情况下为Integer
。因此,您的代码与
Dim x As Integer? = If(1 = 0, 1, 0)
要使结果可为空,您需要使类型显式化。
Dim x As Integer? = If(1 = 0, 1, CType(Nothing, Integer?))
答案 1 :(得分:3)
而不是将Nothing转换为Integer?只需创建一个新的整数?并将其归还。
另外,在使用Nullable类型时,请记住,您应该始终在Nullable(Of T)上使用.Value,.HasValue和.GetValueOrDefault方法,而不是仅仅返回对象。因此,在您的情况下,X的值确实为0,但如果您检查HasValue属性,它应返回False以指示null情况。同样,如果您要检查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)
输出: 空值 假