在可为 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}
.
访问可空 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}
.