VB.NET内联IfElse给可空DateTime赋值异常及解决方法
VB.NET可空DateTime赋值的差异问题解析
问题现象
两段逻辑看似一致的代码,输出结果却完全不同:
代码1(输出默认日期)
Dim myBool As Boolean = False Dim myDate As Date? = If(myBool, Date.Today, Nothing) Console.WriteLine(myDate)
输出结果:1/1/0001 12:00:00 AM
代码2(输出Nothing)
Dim myBool As Boolean = False Dim myDate As Date? If myBool Then myDate = Date.Today Else myDate = Nothing End If Console.WriteLine(myDate)
输出结果:Nothing
原因剖析
问题出在VB.NET的If三元运算符的类型推断规则上:
- 当使用
If(condition, value1, value2)时,编译器会自动推导整个表达式的返回类型。这里value1是Date(非可空值类型),value2是Nothing,编译器会将Nothing隐式转换为Date的默认值(即1/1/0001 12:00:00 AM),最终表达式返回类型为Date而非Date?,赋值给可空变量时自然带上了默认日期。 - 而在多行
If...Else语句中,直接给Date?类型变量赋值Nothing时,编译器会正确识别为可空类型的空值,不会触发隐式类型转换。
单行代码的正确赋值方案
要让单行If表达式返回Date?类型,只需确保分支中存在明确的可空类型标识,以下是三种可行方式:
方式1:显式转换非可空值为可空类型
Dim myBool As Boolean = False Dim myDate As Date? = If(myBool, CType(Date.Today, Date?), Nothing) Console.WriteLine(myDate)
方式2:强类型指定Nothing为可空DateTime
Dim myBool As Boolean = False Dim myDate As Date? = If(myBool, Date.Today, DirectCast(Nothing, Date?)) Console.WriteLine(myDate)
方式3:使用可空类型的构造函数
Dim myBool As Boolean = False Dim myDate As Date? = If(myBool, Date.Today, New Nullable(Of Date)) Console.WriteLine(myDate)
以上三种方式都能让编译器正确推断表达式返回类型为Date?,从而在myBool为False时赋值Nothing,避免出现默认日期。
内容的提问来源于stack exchange,提问作者WSC
相关产品推荐
相关产品推荐

