我今天在VB.Net中发现了这种奇怪的行为,试图使用可以为空的DateTime数据。我从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?
作为强制转换来修复它,但这种行为对我来说似乎很奇怪。期望的类型显然是DateTime?
,因为这是变量类型。此外,可以允许两种可能结果值的最窄类型是DateTime?
,因为它可以是DateTime
或Nothing
。但不知怎的,它决定结果值应该是DateTime
,然后我想将类型Nothing
转换为DateTime.MinValue
?这是怎么回事?
部分问题是我已经习惯了C#,等效表达式rowData["LastRun"] == "" ? null : (DateTime)rowData["LastRun"])
甚至没有编译(如预期的那样),因为“DateTime
和{{1}之间没有隐式转换}}“。
答案 0 :(得分:1)
Nothing
与C#中的null
不同,它是null
和default(T)
之间的混合。因此,当您对值类型(例如结构Nothing
)使用DateTime
时,您会得到它的默认值DateTime.MinValue
。