为什么可以';t我用三进制运算符将null赋值给十进制

本文关键字:运算符 null 十进制 赋值 为什么 | 更新日期: 2023-09-27 18:24:43

我不明白为什么不起作用

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

为什么可以';t我用三进制运算符将null赋值给十进制

因为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?);

这是默认关键字的MSDN链接。

不要使用decimal.Parse

如果给Convert.ToDecimal一个空字符串,它将返回0。如果要解析的字符串为null,decimal.Parse将抛出ArgumentNullException。

试试这个:

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

问题是编译器不知道null的类型是什么。因此,您可以将其强制转换为decimal?

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

因为编译器无法从条件运算符的操作数推断出最佳类型。

在编写condition ? a : b时,必须有从a类型到b类型的隐式转换,或者从b类型到a类型的显式转换。然后编译器将推断出整个表达式的类型作为此转换的目标类型。编译器从不考虑将其分配给decimal?类型的变量。在您的案例中,ab的类型是decimal和一些未知的引用或可为null的类型。编译器猜不出你的意思,所以你需要帮助它:

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

您需要将第一部分转换为decimal?

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