我有一个简单的小代码片段令我感到沮丧:
HashSet<long> groupUIDs = new HashSet<long>();
groupUIDs.Add(uid)? unique++ : dupes++;
在编译时,它会生成错误:
记录只有赋值,调用,递增,递减和新对象表达式才能用作语句
HashSet.Add
返回bool,因此三元(?)运算符应该工作,
这看起来像是一种完全合法的方式来跟踪我添加到哈希集的唯一和重复项的数量。
当我将其重新格式化为if-then-else时,它可以正常工作。
任何人都可以解释错误,并且有没有办法以简单的三元运算符来做这个?
答案 0 :(得分:19)
根据错误消息,三元运算符不能用作语句。你需要做这样的事情把它变成一个任务:
int dummy = groupUIDs.Add(uid)? unique++ : dupes++;
话虽如此,我建议只使用if-then-else。它不那么令人困惑,因为它不涉及创建“魔术”虚拟变量......
答案 1 :(得分:16)
正如其他人所指出的那样,条件运算符不是一个合法的语句表达式。 (法律声明表达式是赋值,调用,递增,递减和构造。)
然而,这里也有一个风格问题。在我看来,表达式应该对其值有用,语句应该对其副作用有用。你遇到的是你有一个只对它的副作用有用的表达式,这是一个糟糕的代码味道。
您有副作用,因此请使用条件语句而不是条件表达式。
答案 2 :(得分:7)
您没有将三元的值结果设置为任何原因。
HashSet<long> groupUIDs = new HashSet<long>();
int count = groupUIDs.Add(uid)? unique++ : dupes++;
答案 3 :(得分:5)
三元运算符不是声明。因此,它不能单独用于指令 - 它相当于编写
"something that is not a statement";
为了澄清,您应该取出三元运算符并使用if。
答案 4 :(得分:4)
编译器并没有抱怨Add
它抱怨你的条件表达式不是一个完整的语句。
某些语言(如JavaScript)允许您像使用此处一样使用条件表达式来分支逻辑,但C#要求您将条件表达式的结果分配给变量。一旦分配了表达式的结果,就可以完成一个完整的语句,并且编译器很高兴。
答案 5 :(得分:2)
您需要使用三元运算符中的值...
HashSet<long> groupUIDs = new HashSet<long>();
int newCount = groupUIDs.Add(uid)? unique++ : dupes++;
或 - 使用if
HashSet<long> groupUIDs = new HashSet<long>();
if (groupUIDs.Add(uid))
unique++;
else
dupes++;
答案 6 :(得分:1)
gmcalab和sr pt是对的;三元运算符旨在为您提供结果,就像1 + 1
给您2
一样。你不能只写:
1 + 1
;
这里的困惑(我认为)是你在考虑三元运算符,就像它是一个函数一样。
答案 7 :(得分:1)
语言参考中的三元运算符的description表示
如果条件为真,则首先表达式 被评估并成为结果; 如果为false,则第二个表达式为 评估并成为结果。
看起来三元只能在赋值的上下文中使用,尽管语言引用并未明确说明它。你没有对结果做任务。
在我看来,重写为if / else会更清楚。
答案 8 :(得分:0)
如果这是不可接受的,为什么你的行?只需使用if语句: - )
bool b = false;
b?callB():callA();