如果 - 检测类型中的奇怪行为

时间:2013-08-23 23:25:13

标签: vb.net casting

我今天在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?,因为它可以是DateTimeNothing。但不知怎的,它决定结果值应该是DateTime,然后我想将类型Nothing转换为DateTime.MinValue?这是怎么回事?

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

1 个答案:

答案 0 :(得分:1)

Nothing与C#中的null不同,它是nulldefault(T)之间的混合。因此,当您对值类型(例如结构Nothing)使用DateTime时,您会得到它的默认值DateTime.MinValue