相同的If()和If产生不同的结果

时间:2010-12-22 17:02:37

标签: .net vb.net if-statement

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

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

第1块:如果()

在这种情况下,它最终为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

3 个答案:

答案 0 :(得分:8)

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

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

  

Nothing(Visual Basic)

     

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

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

有关更详细的说明,see my blog

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

我的提议是在Integer?内使用CType代替Integer