vb.net – 使用可空数据类型的属性分配文本框文本
出于某种原因,当我尝试将可为空的十进制数据类型的属性分配给文本框文本时,我遇到了错误.
例如,我有这个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 它会抛出此消息的异常:
我不明白为什么当我这样做时会发生这种情况: 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,Nothing) 但他们都抛出同样的错误. 但是,当我稍微调整它们时: PackSizeTextBox.Text = If(mProduct.PackSize,"") PackSizeTextBox.Text = If(mProduct.PackSize IsNot Nothing,"") PackSizeTextBox.Text = If(mProduct.PackSize.HasValue,"") 他们奇怪地工作得很好. 最后,我真的不喜欢做长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) 无法工作,因为If运算符基本上是通用的,因为返回的两个值必须是相同的类型.结果,所有Nothing返回值都隐式转换为Decimal?这些值最终必须以完全相同的结果以完全相同的方式隐式转换为String. 你最终得到的代码: PackSizeTextBox.Text = mProduct.PackSize?.ToString 是正确的代码,因为您显式地将非String的内容转换为String,以便将其分配给String属性.这正是你应该做的,以及如果你有Option Strict On你必须要做的事情,你绝对应该这样做. 默认情况下,任何具有Option Strict Off的VB.NET开发人员都是初学者,他们不了解任何更好或更糟的开发人员.现在在项目属性和IDE选项中打开它,以便在将来的所有项目中默认为On.您应该只在特别需要后期绑定时将其关闭,即使这样,也只能在仅包含需要后期绑定的特定代码的部分类文件中将其关闭. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |