一个简单的问题,如果是否内联:将mydate设置为datetime?
'版本1(工作!)
If dtReader.IsDBNull(dtReader.GetOrdinal("mydate")) Then
mydate = Nothing
Else
mydate = dtReader.GetDateTime(dtReader.GetOrdinal("mydate"))
End If
值=无
'第2版(完全无效!)
mydate = If(dtReader.IsDBNull(dtReader.GetOrdinal("mydate")), Nothing, dtReader.GetDateTime(dtReader.GetOrdinal("mydate")))
值=#12:00:00#
有人可以解释一下为什么版本2获得此值吗?
这取决于编译器必须在上进行类型分析If
。请记住,Nothing
它与C#的null不同,它更接近于default(T)
:
如果变量的值类型不能为空,则将其赋值为No会将其设置为声明类型的默认值
现在,当编译器正在分析时If
,必须确定整个表达式的类型。这是它在看什么:
If(Boolean,<AnyType>,DateTime)
现在,它必须根据第二个和第三个参数的类型来决定表达式的类型,并且必须选择一个存在的类型。因此,自然而然地选择了DateTime
。并且Nothing
转换为aDateTime
与最小值相同。
要更改此设置,可以选择推断类型为DateTime?
:
mydate = If(dtReader.IsDBNull(dtReader.GetOrdinal("mydate")), _
CType(Nothing,DateTime?), _
dtReader.GetDateTime(dtReader.GetOrdinal("mydate")))
根据《Visual Basic语言规范》第11.22节(条件表达式):
如果提供了三个操作数,则必须将所有三个表达式分类为值,并且第一个操作数必须是布尔表达式。如果表达式的结果为true,则第二个表达式将是运算符的结果,否则第三个表达式将是运算符的结果。表达式的结果类型是第二个表达式和第三个表达式的类型之间的主导类型。如果没有显性类型,则会发生编译时错误。
(我的重点)。
并且请注意,没有关于“如果在赋值语句中使用此条件,则还可以考虑所赋变量的声明类型”的条件文本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句