我今天在尝试使用可为空的 DateTime 数据时在 VB.Net 中发现了这种奇怪的行为。我正在从 XML 文件中提取一个 DateTime 值以插入数据库,并且我想允许一个空值。所以我想我应该用它If
来防止投射错误:
Dim LastRun As DateTime? = _
If(rowData("LastRun") = "", Nothing, CType(rowData("LastRun"), DateTime))
看起来这应该Nothing
在为假的情况下返回一个值,或者如果该值不为空,则返回一个If
日期时间的值。LastRun
相反,当If
条件返回 false 时,我得到一个值DateTime.MinValue
,这会导致由于 SQL DateTime 下溢而导致插入数据库时出现异常。
我可以通过在最后一个参数中使用DateTime?
as cast 来修复它,但这种行为对我来说似乎很奇怪。预期的类型显然是DateTime?
因为那是变量类型。此外,允许两个可能结果值的最窄类型是DateTime?
,因为它可以是 aDateTime
或Nothing
. 然而不知何故,它决定结果值应该是DateTime
,然后我猜类型转换Nothing
为DateTime.MinValue
?这里发生了什么?
部分问题是我习惯了 C#,等效表达式rowData["LastRun"] == "" ? null : (DateTime)rowData["LastRun"])
甚至无法编译(如预期的那样),因为“DateTime
和之间没有隐式转换null
”。