当访问一个可以为空的DateTime?
变量的.HasValue属性时(当它没有值的时候),我得到了以下错误。
它在我的开发机器(Win 10,VS 2017)上运行良好,但在由TFSv15.117构建定义(设置为使用VS 2017版本)构建并发布到客户端服务器(Windows server 2012 R2标准版)后,抛出以下错误:
NullReferenceException:未设置对象变量或具有块变量。Microsoft.VisualBasic.CompilerServices.Container..ctor(Object实例) +1479606
Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object实例,类型类型,字符串MemberName,Object[]参数,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)
发布于 2018-06-28 18:18:20
我刚刚测试了这段代码,并看到了与您描述的相同的行为:
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?
会给出一个Nothing
的Object
引用,而试图访问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
现在我收到了一个MissingMemberException
,其中包含以下消息:
找不到类型为'Date‘的
公共成员'HasValue’。
似乎装箱一个可空的值类型并没有保留原始变量是可空的知识。如果Object
变量为Nothing
,则调试器仅将其识别为Object
,否则将其识别为Object {Date}
。
https://stackoverflow.com/questions/51079413
复制相似问题