关于vb.net:将运算符的结果赋给System.Nullable类型

Assigning result of If operator to System.Nullable type

使用if运算符(http://msdn.microsoft.com/en-us/library/bb513985(v=vs.100).aspx)将值赋给System.Nullable对象时,如果结果为Nothing(空),则将0赋给该对象。

例子:

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

如果x是可以为空的类型,为什么要将其指定为默认的整数类型0。它不应该接收空值吗?


值类型上下文中的Nothing解析为该类型的默认值。对于整数,这只是0

If运算符不在其参数类型之间进行任何转换,在您的情况下,它们都被平等地视为Integer。因此,您的代码与

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

要使结果可以为空,需要使类型显式。

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


而不是以整数形式返回Nothing?只是创建一个新的整数?然后把它还给我。

此外,在处理可为空的类型时,应始终在可为空(t的)上使用.value、.hasValue和.getValueOrDefault方法,而不仅仅是返回对象。因此,在您的情况下,x的值确实是0,但是如果您检查hasValue属性,它应该返回false以指示空情况。同样,如果您想检查If x = Nothing,它将返回false,但If x.HasValue = False返回true。

您还可以将示例编写为以下正确的示例:

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

输出:无效的假