我无法理解为什么这不起作用
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: null;
答案 0 :(得分:43)
因为null
的类型为object
(实际上是无类型的),您需要将其分配给类型化对象。
这应该有效:
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: (decimal?)null;
或者这更好一点:
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: default(decimal?);
以下是default关键字的MSDN链接。
答案 1 :(得分:7)
请勿使用decimal.Parse
。
Convert.ToDecimal
将返回0。如果要解析的字符串为null,decimal.Parse
将抛出ArgumentNullException。
答案 2 :(得分:5)
试试这个:
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ?
decimal.Parse(txtLineCompRetAmt.Text.Replace(",", "")) :
(decimal?) null;
问题是编译器不知道null
的类型。所以你可以把它投到decimal?
答案 3 :(得分:3)
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ?
decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) :
(decimal?)null;
答案 4 :(得分:3)
因为编译器无法从条件运算符的操作数中推断出最佳类型。
当您撰写condition ? a : b
时,必须存在从a
类型到b
类型或b
类型到类型的隐式转换a
。然后,编译器将推断整个表达式的类型作为此转换的目标类型。编译器从不考虑将它分配给类型为decimal?
的变量的事实。在您的情况下,a
和b
的类型为decimal
以及某些未知引用或可空类型。编译器无法猜出你的意思,所以你需要帮助它:
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: default(decimal?);
答案 5 :(得分:2)
您需要将第一部分投射到decimal?
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? (decimal?)decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: null;