Nullable类型,如果问题

时间:2018-03-20 13:32:44

标签: .net vb.net nullable

这是最简单的代码

Dim testInvoiceDate As DateTime? = If(String.IsNullOrEmpty(Nothing),
                                      Nothing,
                                      New DateTime(2018, 3, 20))

为什么变量testInvoiceDate不是Nothing,而是#1/1/0001 12:00:00 AM#? 这很奇怪!

4 个答案:

答案 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有多种含义。

  1. null
  2. 该类型的默认值
  3. 在这种情况下,编译器使用第二个选项,因为在DateTimeNothing之间没有隐式转换(在null的含义中)。

    默认值DateTimeStructure是值类型)是#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)

VB.Net中的

Nothing相当于C#中的default(T):给定类型的默认值。

  • 对于值类型,这基本上相当于“零”:0IntegerFalseBoolean,{{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))您将获得预期的价值。