【问题标题】:Identical If() and If yield different results相同的 If() 和 If 产生不同的结果
【发布时间】:2010-12-22 17:02:36
【问题描述】:

下面两段代码有什么区别?我希望他们返回相同的结果,但他们没有。

在 xml.@Type = "null" 的情况下,我希望 PatientMetricTypeID(一个可为空的整数)最终成为 Nothing。

第 1 块:If()

在这种情况下,它最终为 0。看起来 Nothing 被视为整数并转换为 0。我可以理解为什么会发生这种情况但不完全......我想确切地了解如何这行得通,如果有解决方法。

    Dim PatientMetricTypeID As Integer? = If(xml.@Type = "null",
                                 Nothing,
                                 CType([Enum].Parse(GetType(PatientMetricTypes), xml.@Type), Integer))

第 2 块:如果

在这种情况下,它以 Nothing 结束——预期的行为。

    Dim PatientMetricTypeID As Integer?

    If xml.@Type = "null" Then
        PatientMetricTypeID = Nothing
    Else
        PatientMetricTypeID = CType([Enum].Parse(GetType(PatientMetricTypes), xml.@Type), Integer)
    End If

【问题讨论】:

    标签: .net vb.net if-statement


    【解决方案1】:

    If 表达式的类型是 Integer,而不是 Integer?

    VB.Net 的Nothing 关键字不等于null;它等价于 C# 的 default(T),其中 T 是表达式使用的类型。
    引用MSDN:

    什么都没有(Visual Basic)

    代表任何数据类型的默认值。

    当你写If(..., Nothing, SomeInteger)时,如果If被输入为Integer,那么Nothing变成0
    要强制将If 表达式键入为Integer?,您可以将Nothing 替换为New Integer?()

    更详细的解释,see my blog

    【讨论】:

      【解决方案2】:

      SLaks 已经解释了这种行为的原因。这是绕过它的另一种方法:

      ... = If(xml.@Type = "null", DirectCast(Nothing, Integer?), ...)
      

      大约一年前,我为此向 Microsoft 注册了一份错误报告:

      他们考虑在下一个版本的 VB 编译器中添加一个警告。

      【讨论】:

      • 哇,他们真的很重视你。这很酷。 :) +1 直接修复。
      • 或者,正如我所说,New Integer?()
      【解决方案3】:

      我的提议是在CType 中使用Integer? 而不是Integer

      【讨论】:

      • 那行不通。您不能一步将枚举转换为Integer?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      相关资源
      最近更新 更多