【问题标题】:Assigning result of If operator to System.Nullable type将 If 运算符的结果分配给 System.Nullable 类型
【发布时间】:2011-11-06 22:35:52
【问题描述】:

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

【问题讨论】:

    标签: vb.net vb.net-2010


    【解决方案1】:

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

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

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

    要使结果可以为空,您需要明确类型。

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

    【讨论】:

    • 嗯,这行得通,但我还是不明白为什么。可空类型不是值类型。如果我设置 x = Nothing,那么 x 确实为空。此外,根据我在原始问题中链接的 MSDN 文档,If() 运算符将后两个参数评估为 Object 类型。因此,我认为从 If() 运算符返回 Nothing 作为 Object 类型并将其分配给可为空的类型与设置 x = Nothing 相同。为什么它默认将 Nothing 转换为整数类型,迫使我执行显式 CType()?
    • @NYSystemsAnalyst 您误读了文档。 If 的参数类型 not 评估为 Object(当然,文档非常具有误导性)。此外,在将参数类型解析为If 时,从不考虑返回类型(即我们分配给的变量的类型),唯一考虑的是参数类型本身。编译器只有一个要求:两个操作数的类型相同,或者能够将一个隐式转换为另一个。
    • @NYSystemsAnalyst 可空类型实际上是一种值类型(您可以在 MSDN 中查找 System.Nullable),只是语言和 IDE 为其提供特殊处理的类型。
    • 谢谢你们。我确实认为该操作员的文档不完整且具有误导性,但是在您的解释和我在这两个类似问题中找到的解释之间,我相信我对它的理解要好得多。 stackoverflow.com/questions/4147277/…stackoverflow.com/questions/4189876/…
    【解决方案2】:

    而不是返回 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)
    

    输出: 空值 假的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2011-02-06
      • 1970-01-01
      • 2017-01-11
      • 2019-05-24
      相关资源
      最近更新 更多