0

我今天在尝试使用可为空的 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?,因为它可以是 aDateTimeNothing. 然而不知何故,它决定结果值应该是DateTime,然后我猜类型转换NothingDateTime.MinValue?这里发生了什么?

部分问题是我习惯了 C#,等效表达式rowData["LastRun"] == "" ? null : (DateTime)rowData["LastRun"])甚至无法编译(如预期的那样),因为“DateTime和之间没有隐式转换null”。

4

1 回答 1

1

NothingnullC# 不同,它是 和 之间的混合nulldefault(T)。因此,当您Nothing在值类型(如结构DateTime)上使用时,您会得到它的默认值 what is DateTime.MinValue

于 2013-08-23T23:28:05.727 回答