当前位置 : 主页 > 编程语言 > c语言 >

vb.net – 使用可空数据类型的属性分配文本框文本

来源:互联网 收集:自由互联 发布时间:2021-06-24
出于某种原因,当我尝试将可为空的十进制数据类型的属性分配给文本框文本时,我遇到了错误. 例如,我有这个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

我希望有人可以向我解释我遇到的错误.
谢谢!

TextBox的Text属性是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你必须要做的事情,你绝对应该这样做.

默认情况下,任何具有Option Strict Off的VB.NET开发人员都是初学者,他们不了解任何更好或更糟的开发人员.现在在项目属性和IDE选项中打开它,以便在将来的所有项目中默认为On.您应该只在特别需要后期绑定时将其关闭,即使这样,也只能在仅包含需要后期绑定的特定代码的部分类文件中将其关闭.

网友评论