出于某种原因,当我尝试将可为空的十进制数据类型的属性分配给文本框文本时,我遇到了错误. 例如,我有这个Product类: Public Class Product Public Property ProductId As Integer Public Property ProductNa
例如,我有这个Product类:
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 object must have a value.
我不明白为什么当我这样做时会发生这种情况:
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
我希望有人可以向我解释我遇到的错误.
谢谢!
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你必须要做的事情,你绝对应该这样做.
默认情况下,任何具有Option Strict Off的VB.NET开发人员都是初学者,他们不了解任何更好或更糟的开发人员.现在在项目属性和IDE选项中打开它,以便在将来的所有项目中默认为On.您应该只在特别需要后期绑定时将其关闭,即使这样,也只能在仅包含需要后期绑定的特定代码的部分类文件中将其关闭.