为什么我的Nullable(Of Int32)在我设置为Nothing后为0?

时间:2015-06-25 14:21:49

标签: vb.net nullable

我认为我遗漏了一些关于可空类型的基本内容。希望这个例子能够开辟新的理解,但至少,也许我们可以让这一件事能正常运作。

在课堂(对话形式)中,我声明:

Property ProductStructureHeaderKey As Int32?

在另一个类中,我声明该对话框的一个实例,并尝试使用此行设置该属性:

    dr.ProductStructureHeaderKey = If(parentRow.Cells(1).Value Is Nothing, Nothing, Int32.Parse(parentRow.Cells(1).Value))

当该行为属性赋予Nothing时,该属性等于0.(然后,当我希望它传递NULL时,它将0传递给DB。)

这不是我的期望,我不断寻找代码(SO,MSDN等),看起来我做得对,但显然,我不是。那么,朋友们,我做错了什么?如何使用Nullable类型来满足我的需求?

1 个答案:

答案 0 :(得分:2)

这是C#和VB.NET之间的差异之一。在VB.NET中,Nothing不仅意味着null,还意味着default。因此,您要将默认值Int32分配给属性为0.这是由If-operator引起的,该Why is there a difference in checking null against a value in VB.NET and C#?必须从两个值中推断出类型而不是要分配的属性。

而是使用If...Else

If parentRow.Cells(1).Value Is Nothing Then
    dr.ProductStructureHeaderKey = Nothing ' Now it's not 0 but Nothing
Else
    dr.ProductStructureHeaderKey = Int32.Parse(parentRow.Cells(1).Value)
End If

或使用new Nullable(Of Int32)

强制可以为空
dr.ProductStructureHeaderKey = If(parentRow.Cells(1).Value Is Nothing, new Nullable(Of Int32), Int32.Parse(parentRow.Cells(1).Value))

进一步阅读:{{3}}