在可为 null 的 DateTime 变量上访问 .HasValue 时出错

Error accessing .HasValue on nullable DateTime variable

访问可空 DateTime? 变量的 .HasValue 属性 时(当它没有值时)出现以下错误。

它在我的开发机器(Win 10、VS 2017)上运行良好,但在通过 TFS v15.117 构建定义(设置为使用 VS 2017 版本)构建并发布到客户端服务器后(Windows Server 2012 R2 Standard),抛出如下错误:

[NullReferenceException: Object variable or With block variable not set.] Microsoft.VisualBasic.CompilerServices.Container..ctor(Object Instance) +1479606
Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack) +250

为什么 myDateTimeVar.HasValue 在一个系统上工作,但在另一个系统上就这样失败了?

编辑:

Dim testDate1 As DateTime? = Nothing
Dim testDate2 As DateTime? = DateTime.Now
Dim testDate3 As DateTime? = DateTime.MinValue
Dim testDate4 As DateTime?
Debug.WriteLine(testDate1.HasValue) 'False
Debug.WriteLine(testDate2.HasValue) 'True
Debug.WriteLine(testDate3.HasValue) 'True
Debug.WriteLine(testDate4.HasValue) 'False

[基于对 J 的回答的评论中的讨论] 此代码在本地项目中完美运行。您认为 Option Strict 在不同的配置/环境中的应用是否不同? (虽然 TFS Build Def 设置为使用 Debug)

我刚刚测试了这段代码,看到了与您描述的相同的行为:

Option Strict Off

Module Module1

    Sub Main()
        Dim nullableDate As Date? = Nothing
        Dim boxedNullableDate As Object = nullableDate

        Console.WriteLine(boxedNullableDate.HasValue)
        Console.ReadLine()
    End Sub

End Module

异常的原因是装箱一个没有值的 Date? 给你一个 Object 引用 Nothing 并试图访问 [=14 的任何成员=] 抛出 NullReferenceException.

这基本上意味着与可空值类型的后期绑定是行不通的。

编辑:

有趣的是,我只是将代码更改为:

Option Strict Off

Module Module1

    Sub Main()
        Dim nullableDate As Date? = Date.Now
        Dim boxedNullableDate As Object = nullableDate

        Console.WriteLine(boxedNullableDate.HasValue)
        Console.ReadLine()
    End Sub

End Module

现在我收到 MissingMemberException 消息:

Public member 'HasValue' on type 'Date' not found.

装箱一个可为空的值类型似乎并没有保留原始变量可以为空的知识。如果 Object 变量是 Nothing,则调试器仅将其识别为 Object,否则 Object {Date}.