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

abe*_*nky 22 c# conditional-operator

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

HashSet<long> groupUIDs = new HashSet<long>();
groupUIDs.Add(uid)? unique++ : dupes++;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

sth*_*sth 19

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

int dummy = groupUIDs.Add(uid)? unique++ : dupes++;
Run Code Online (Sandbox Code Playgroud)

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

  • 或者使用if代替三元运算符,而不是为了代码凉爽和可读性的损害而为无用变量赋值. (9认同)
  • `if(groupsUIDs.Add(uid)){unique ++; } else {dupes ++; }`只有15个字符. (3认同)

Eri*_*ert 16

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

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

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

  • @abelenky:我很受宠若惊,但请不要为我的缘故这样做.为了将来必须维护您的代码的人们这样做.:-) (8认同)

Gab*_*abe 7

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

HashSet<long> groupUIDs = new HashSet<long>();
int count = groupUIDs.Add(uid)? unique++ : dupes++;
Run Code Online (Sandbox Code Playgroud)


ANe*_*ves 5

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

"something that is not a statement";
Run Code Online (Sandbox Code Playgroud)

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