当我尝试运行时
InvTotal = g.Sum(d => d.Field<double>("Total")) < 0 ? "W" : "N"
,我得到了
Unable to cast object of type 'System.Double' to type 'System.String'
错误。
如何更改成功编译的代码。
答案 0 :(得分:10)
我认为你需要正确的括号。
var InvTotal = (g.Sum(d => d.Field<double>("Total")) < 0) ? "W" : "N"
如果没有它们,编译器将首先编译0 ? "W" : "N"
,其结果将用于比较。
有时,C#编译器需要一点帮助才能实现?操作
答案 1 :(得分:1)
InvTotal的类型是什么?我猜它现在是Double。如果您将类型更改为String,或者删除InvTotal的声明并将您的行更改为&#34; var InvTotal = g.Sum ...&#34;
答案 2 :(得分:0)
我认为在这种情况下,括号没有问题。
问题在于InvTotal
的类型,如果你写var InvTotal =....
,一切都会好的。
对Maarten的解释回答:
在C#中,我们不能写出类似的内容:
int x = 2;
var tmp = x ? "W" : "N";
如果我们尝试,我们会收到以下错误:
错误:“无法将类型'int'隐式转换为'bool'”
C#不是C ++,其中0表示false,非零值表示true。
所以你可以这样写:
g.Sum(d => d.Field<double>("Total")) < 0 ? "W" : "N"
您还可以在三元运算符的第一部分中使用多个不带括号的逻辑运算符:
g.Sum(d => d.Field<double>("Total")) < 0 && 1 == 1 && 2 != 4 && 9 != 0 ? "W" : "N";