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

时间:2018-06-28 09:33:31

标签: asp.net vb.net msbuild nullable

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

它在我的开发机器上(Win 10,VS 2017)可以正常工作,但是在由TFS v15.117构建定义(设置为使用VS 2017版本)构建之后并发布到客户端的服务器(Windows Server 2012 R2)标准),则会引发以下错误:

  

[NullReferenceException:对象变量或不带块变量   set。] Microsoft.VisualBasic.CompilerServices.Container..ctor(Object   实例)+1479606
  Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object   实例,类型类型,字符串MemberName,对象[]参数,字符串[]   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)

1 个答案:

答案 0 :(得分:1)

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

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的{​​{1}}引用,并尝试访问Nothing的任何成员抛出Nothing

基本上,这意味着使用可为空的值类型进行后期绑定根本行不通。

编辑:

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

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

  

找不到类型为“日期”的公共成员“ HasValue”。

装箱可为空的值类型似乎并不能保留原始变量为可为空的知识。调试器仅将MissingMemberException识别为Object,否则将Object识别为Nothing