出于某种原因,当我尝试将可为空的十进制数据类型的属性分配给文本框文本时,我遇到了错误。
例如,我有这个产品类:
Public Class Product
Public Property ProductId As Integer
Public Property ProductName As String
Public Property [Variant] As String
Public Property PackSize As Decimal?
End Class
并且Product
的实例的[Variant]
值为Nothing
,PackSize
值为Nothing
。
当我尝试将[Variant]
值分配给如下文本框时:
VariantTextBox.Text = mProduct.[Variant]
它工作正常。
但是当我尝试将PackSize
值分配给这样的文本框时:
PackSizeTextBox.Text = mProduct.PackSize
它会抛出此消息的异常:
Nullable对象必须有值。
我不明白为什么会发生这种情况:
PackSizeTextBox.Text = Nothing
没有任何错误。
我尝试过其他方式:
PackSizeTextBox.Text = If(mProduct.PackSize, Nothing)
PackSizeTextBox.Text = If(mProduct.PackSize IsNot Nothing, mProduct.PackSize, Nothing)
PackSizeTextBox.Text = If(mProduct.PackSize.HasValue, mProduct.PackSize, Nothing)
但他们都会犯同样的错误。
然而,当我稍微调整它们时:
PackSizeTextBox.Text = If(mProduct.PackSize, "")
PackSizeTextBox.Text = If(mProduct.PackSize IsNot Nothing, mProduct.PackSize, "")
PackSizeTextBox.Text = If(mProduct.PackSize.HasValue, mProduct.PackSize, "")
他们奇怪地工作得很好。
最终,我真的不喜欢做长If
语句只是为了获得可以为空的数据类型属性的值,所以我就这样做了:
PackSizeTextBox.Text = mProduct.PackSize?.ToString
我希望有人可以向我解释我遇到的错误。 谢谢!
答案 0 :(得分:6)
Text
的{{1}}属性类型为TextBox
,因此唯一可分配给它的是String
。如果您有String
并指定了Option Strict Off
以外的内容,则系统会隐式调用String
。这意味着:
ToString
与此基本相同:
PackSizeTextBox.Text = mProduct.PackSize
并且显而易见的是,当PackSizeTextBox.Text = mProduct.PackSize.Value.ToString()
为mProduct.PackSize
时,您会收到错误消息。
所有这些:
Nothing
无法工作,因为PackSizeTextBox.Text = If(mProduct.PackSize, Nothing)
PackSizeTextBox.Text = If(mProduct.PackSize IsNot Nothing, mProduct.PackSize, Nothing)
PackSizeTextBox.Text = If(mProduct.PackSize.HasValue, mProduct.PackSize, Nothing)
运算符基本上是通用的,因为返回的两个值必须是相同的类型。因此,您的所有If
返回值都会隐式转换为Nothing
值,最终必须以完全相同的方式隐式转换为Decimal?
同样的结果。
您最终获得的代码:
String
是正确的代码,因为您明确地将非PackSizeTextBox.Text = mProduct.PackSize?.ToString
的内容转换为String
,以便将其分配给String
属性。这正是你应该做的,以及如果你有String
,你绝对应该做的事情。
默认情况下,Option Strict On
的任何VB.NET开发人员都是初学者,不知道任何更好或更糟的开发人员。现在在项目属性中以及在IDE选项中将其Option Strict Off
转为,以便在将来的所有项目中默认为On
。当你特别需要后期绑定时,你应该只将它变成On
,即使这样,也只能在只包含需要后期绑定的特定代码的部分类文件中。{/ p>