下面两段代码的区别是什么?我希望他们能够返回相同的结果,但他们没有。
在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
答案 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