3

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

4

2 回答 2

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?))
于 2011-08-30T15:56:19.913 回答
3

而不是返回 Nothing 转换为整数?只是创建一个新的整数?并返回它。

此外,请记住,在使用 Nullable 类型时,您应该始终在 Nullable(Of T) 上使用 .Value、.HasValue 和 .GetValueOrDefault 方法,而不仅仅是返回对象。因此,在您的情况下,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)

输出:空假

于 2011-08-30T16:49:24.130 回答