VB中List内double转decimal、string转double类型转换错误如何解决
问题原因
- 类型不匹配1:代码中直接使用的
2.0、2.5这类带小数点的字面量,VB默认会识别为Double类型,而你的MenuItem类的价格属性是Decimal类型,两者没有隐式转换路径,开启Option Strict后会直接报编译错误。 - 类型不匹配2:文本框的
Text属性是String类型,无法直接和数值做乘法运算,哪怕关闭Option Strict,运行时如果文本框内容不是合法数值也会触发转换失败的运行时错误。 - 之前的修改错误:你用
CDbl转换后的结果还是Double类型,和目标的Decimal类型仍不匹配,所以没有解决问题。 - 额外注意:你描述中声明的价格属性名为
price,但代码中使用的是.Cost,如果属性名不匹配也会触发报错,需要先确认属性的实际命名。
修复方案
基础修复(已确认文本框输入为合法数字时可用)
修改后的代码如下,数值字面量后加D后缀显式声明为Decimal类型,同时用Decimal.Parse将文本框内容转换为Decimal类型后再运算:
Dim menu As New List(Of MenuItem) From { New MenuItem With {.Name = "Burger", .Cost = 2D * Decimal.Parse(txtburger.Text)}, New MenuItem With {.Name = "wrap", .Cost = 2D * Decimal.Parse(txtwrap.Text)}, New MenuItem With {.Name = "Parmesan", .Cost = 2.5D * Decimal.Parse(txtparmesan.Text)}, New MenuItem With {.Name = "Stirfry", .Cost = 3D * Decimal.Parse(txtstirfry.Text)} }
如果你的价格属性实际名为Price,把代码中所有.Cost替换为.Price即可。
优化方案(避免非数字输入导致运行时错误)
建议提前用Decimal.TryParse校验文本框输入,示例如下:
' 以汉堡数量校验为例,其他菜品同理 Dim burgerCount As Decimal If Not Decimal.TryParse(txtburger.Text, burgerCount) Then MessageBox.Show("请输入合法的汉堡购买数量") Return End If ' 初始化时直接使用校验后的变量 Dim menu As New List(Of MenuItem) From { New MenuItem With {.Name = "Burger", .Cost = 2D * burgerCount}, ' 其他菜品的初始化逻辑 }
内容的提问来源于stack exchange,提问作者Hamza Asim
相关产品推荐
相关产品推荐

