C#条件运算符不是语句?

我有一个简单的小代码片段令我感到沮丧:

HashSet groupUIDs = new HashSet(); groupUIDs.Add(uid)? unique++ : dupes++; 

在编译时,它会生成错误:

只有赋值,调用,递增,递减和新对象表达式才能用作语句

HashSet.Add返回bool,因此三元(?)运算符应该工作,这看起来像是一种完全合法的方式来跟踪我添加到哈希集的唯一和重复项的数量。

当我将其重新格式化为if-then-else时,它可以正常工作。

任何人都可以解释错误,如果有一种方法可以做一个简单的三元运算符?

根据错误消息,三元运算符不能用作语句。 你需要做这样的事情把它变成一个任务:

 int dummy = groupUIDs.Add(uid)? unique++ : dupes++; 

话虽这么说,我建议只使用if-then-else。 它不那么令人困惑,因为它不涉及创建“魔术”虚拟变量……

正如其他人所指出的那样,条件运算符不是一个合法的声明表达式。 (法律声明表达式是赋值,调用,增量,减量和构造。)

但是,这里也有一个风格问题。 在我看来, 表达式对于它们的值应该是有用的 ,并且语句应该对它们的副作用有用 。 你遇到的是你有一个只对它的副作用有用的表达式,这是一个糟糕的代码味道。

您有副作用,因此请使用条件语句而不是条件表达式。

您没有将三元的值结果设置为任何原因。

 HashSet groupUIDs = new HashSet(); int count = groupUIDs.Add(uid)? unique++ : dupes++; 

三元运算符不是声明。 因此,它不能单独用于指令 – 它相当于写作

 "something that is not a statement"; 

为了澄清,你应该取出三元运算符并使用if。

编译器没有抱怨Add it抱怨你的条件表达式不是一个完整的语句。

某些语言(如JavaScript)允许您像使用此处一样使用条件表达式来分支逻辑,但C#要求您将条件表达式的结果分配给变量。 一旦分配了表达式的结果,就可以完成一个完整的语句,并且编译器很高兴。

你需要使用三元运算符的值来…

 HashSet groupUIDs = new HashSet(); int newCount = groupUIDs.Add(uid)? unique++ : dupes++; 

或者 – 使用if

 HashSet groupUIDs = new HashSet(); if (groupUIDs.Add(uid)) unique++; else dupes++; 

gmcalab和sr pt是对的; 三元运算符是为了给你一个结果,就像1 + 1给你2 。 你不能只写:

1 + 1 ;

这里的混淆(我认为)是你正在考虑三元运算符,就像它是一个函数。

语言参考中的三元运算符的描述说明了这一点

如果condition为true,则计算第一个表达式并成为结果; 如果为false,则计算第二个表达式并成为结果。

看起来三元只能在赋值的上下文中使用,尽管语言引用并未明确说明它。 你没有对结果做任务。

在我看来,重写为if / else会更清楚。

如果这是不可接受的,为什么你的行? 只需使用if语句:-)

  bool b = false; b?callB():callA();