这是最简单的代码
Dim testInvoiceDate As DateTime? = If(String.IsNullOrEmpty(Nothing),
Nothing,
New DateTime(2018, 3, 20))
为什么变量testInvoiceDate
不是Nothing
,而是#1/1/0001 12:00:00 AM#
?
这很奇怪!
答案 0 :(得分:4)
If
- 语句将为两种情况返回相同的数据类型。
由于False
- 案例中的返回类型为DateTime
,因此返回类型为DateTime
- True
- 案例的默认值。
DateTime
的默认值为DateTime.MinValue
,即#1/1/0001 12:00:00 AM#
。
这将按预期工作:
Dim testInvoiceDate As DateTime? = If(String.IsNullOrEmpty(Nothing),
Nothing,
New DateTime?(New Date(2018, 3, 20)))
答案 1 :(得分:3)
在VB.NET中编译(而不是C#)因为Nothing
有多种含义。
null
在这种情况下,编译器使用第二个选项,因为在DateTime
和Nothing
之间没有隐式转换(在null
的含义中)。
默认值DateTime
(Structure
是值类型)是#1/1/0001 12:00:00 AM#
您可以使用它来获取Nullable(Of DateTime)
:
Dim testInvoiceDate As DateTime? = If(String.IsNullOrEmpty(Nothing), New Nullable(Of Date), New DateTime(2018, 3, 20))
或使用If
:
Dim testInvoiceDate As DateTime? = Nothing
If Not String.IsNullOrEmpty(Nothing) Then testInvoiceDate = New DateTime(2018, 3, 20)
答案 2 :(得分:2)
Nothing
相当于C#中的default(T)
:给定类型的默认值。
0
为Integer
,False
为Boolean
,{{1}为DateTime.MinValue
,},DateTime
值(引用的引用,没有任何内容)。将null
归为Nothing
因此与分配DateTime
答案 3 :(得分:2)
这是因为您正在使用If()
的3参数形式。它将尝试基于参数2和3返回相同的类型,因此参数2中的Nothing转换为DateTime(并且您获得DateTime.MinValue)。
如果使用2参数形式,则应用null-coalescing,即当第一个参数(必须是Object或可空类型)为Nothing
时,它返回第二个参数,否则返回第一个论点。
如果你使用
Dim foo As DateTime? = If(Nothing, new DateTime(2018, 3, 20))
您将获得预期的价值。