将If运算符的结果分配给System.Nullable类型

时间:2011-08-30 15:49:42

标签: vb.net vb.net-2010

使用 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值吗?

2 个答案:

答案 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)

输出: 空值 假