VB.NET - 创建具有 HasValue = False 的 Nullable(Of T)

3
我正在使用 LINQ to SQL 连接我的 WinForms (VB.NET) 程序与某个经常会有 DateTime 列为空的 SQL Server 数据库。我扩展了一些 LINQ 对象,并添加了一些 Nullable(Of DateTime) 属性。基本上,我正在计算特定值是否存在。该值是一个 DateTime。如果它不存在,我想创建一个 Nullable(Of DateTime) 对象(结构,或其他),并将 HasValue 属性设置为 False。
我进行了一些研究,显然,在 Nullable(T) 上的 New 构造函数会创建一个 HasValue 设置为 True 的对象。
两个问题:
1. 为什么会这样呢?既然 Nullable(T) 结构是专门为这种情况创建的,那么默认行为为什么是 HasValue=True 呢?
2. 初始化一个Nullable(Of T) 以实际上是 null,最好的方法是什么?
谢谢!
2个回答

3
如果你将一个值提供给Nullable构造函数,那么它将具有给定的值,这将导致你描述的情况,其中HasValue为true。
要声明一个具有HasValuefalse的可空类型,可以采用以下任一方法:
Dim x As Nullable(Of DateTime)
Dim y As DateTime?

然而,如果您使用构造函数并提供一个值,则可空结构将不具有null值,并且它的HasValue将是true

Dim z As New Nullable(Of DateTime)(DateTime.Now)

2

Ahmad的回答很好。即使在MSDN上奇怪地没有任何迹象,也有一个空构造函数:

Dim x As New Nullable(Of DateTime)
Debug.Assert(x.HasValue = False)

正如预期的那样,HasValue 是 false。如果你有一个带有值的 Nullable(T) ,并且想要删除该值,你只需将其设置为 Nothing,就像它是引用类型一样:

x = New Date(2011, 1, 1)
x = Nothing
Debug.Assert(x.HasValue = False)

你确定这是正确的吗?我几乎可以肯定我尝试使用 Dim x as New Nullable(Of DateTime),但是返回一个具有 HasValue = TrueValue = '1/1/0001 00:00' 的对象。我错了吗? - mbm29414
我在示例代码中放置Debug.Assert的原因是我运行了这段代码,而Asserts确保HasValue确实为false;-) - Meta-Knight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接