访问可为空的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)
答案 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
。