为什么我不能用三元运算符将null赋值给十进制?

时间:2012-02-16 09:18:25

标签: c# asp.net

我无法理解为什么这不起作用

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null;

6 个答案:

答案 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?的变量的事实。在您的情况下,ab的类型为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;