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

C#条件运算符不是语句吗?,c#,conditional-operator,C#,Conditional Operator,我有一个简单的小代码片段让我很沮丧: HashSet<long> groupUIDs = new HashSet<long>(); groupUIDs.Add(uid)? unique++ : dupes++; HashSet-groupUIDs=newhashset(); groupUIDs.Add(uid)?唯一++:重复++; 在编译时,它会生成错误: 只能将赋值、调用、递增、递减和新对象表达式用作语句 HashSet.Add被记录为返回bool,因此三元(?)

我有一个简单的小代码片段让我很沮丧:

HashSet<long> groupUIDs = new HashSet<long>();
groupUIDs.Add(uid)? unique++ : dupes++;
HashSet-groupUIDs=newhashset();
groupUIDs.Add(uid)?唯一++:重复++;
在编译时,它会生成错误:

只能将赋值、调用、递增、递减和新对象表达式用作语句

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

当我将它重新格式化为if-then-else时,它工作得很好


有人能解释这个错误吗?如果有一个简单的三元运算符可以这样做吗?

编译器不是在抱怨
Add
而是在抱怨你的条件表达式不是一个完整的语句


一些语言(如JavaScript)允许您使用条件表达式来分支逻辑,就像您在这里所做的那样,但C#要求您将条件表达式的结果分配给变量。一旦您指定了表达式的结果,您就完成了一个完整的语句,编译器也很高兴。

您没有将三元数的值结果设置为任何值,这就是原因所在

HashSet<long> groupUIDs = new HashSet<long>();
int count = groupUIDs.Add(uid)? unique++ : dupes++;
HashSet-groupUIDs=newhashset();
int count=groupUIDs.Add(uid)?唯一++:重复++;

三元运算符不是语句。因此,它不能单独用于指令中——它相当于书写

"something that is not a statement";

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

根据错误消息,三元运算符不能用作语句。您需要这样做才能将其转化为作业:

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

也就是说,我建议只使用if-then-else。它不那么令人困惑,因为它不涉及“神奇”虚拟变量的创建…

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


gmcalab和sr pt是正确的;三元运算符的作用是给你一个结果,就像
1+1
给你
2
一样。你不能只写:

1+1


这里的混乱(我认为)是你把三元运算符当作一个函数来考虑。

你需要用三元运算符的值来做一些事情

HashSet<long> groupUIDs = new HashSet<long>();
int newCount = groupUIDs.Add(uid)? unique++ : dupes++;
HashSet-groupUIDs=newhashset();
int newCount=groupUIDs.Add(uid)?唯一++:重复++;
或者-使用if

HashSet<long> groupUIDs = new HashSet<long>();
if (groupUIDs.Add(uid))
   unique++;
else
   dupes++;
HashSet-groupUIDs=newhashset();
if(groupUIDs.Add(uid))
唯一++;
其他的
dupes++;
语言引用中三元运算符的

如果条件为true,则第一个表达式 被评估并成为结果; 如果为false,则第二个表达式为 评估并成为结果

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


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

正如其他人所指出的,条件运算符不是合法的语句表达式。(法律声明表达式包括赋值、调用、递增、递减和构造。)

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


你有一个副作用,所以使用条件语句而不是条件表达式。

实际上,它在抱怨三元运算符。@Andrew这些不是增量吗,错误消息中提到的哪个语句是有效的?@abelenky:在这里使用
++
操作符没有什么错。问题在于三元表达式本身不是一个语句:类似于
groupUIDs.Add(uid)之类的语句?0 : 1;也不起作用。这似乎可以解决它。在C语言中,一个独立的三元数没有什么错。显然,这在C#中是不正确的。谢谢。或者使用if而不是三元运算符,而不是为了代码冷静和不利于可读性而给无用的变量赋值。一个完全格式化的if语句需要8行额外的缩进级别。对于这样一个简单的操作来说,这似乎是一个巨大的浪费。作为一名C/C++程序员,我非常熟悉Triangal,没有发现任何酷的因素,也没有发现它会损害可读性。我更喜欢在同一行中打开括号,但关于行数,你是绝对正确的。如果你喜欢的话,一定要使用三元运算和虚拟运算——只要这是一个基于知识的选择,那就是一个很好的选择。:)<代码>如果(GuppuSudi.Audio(UID)){Ont+++;} {{Duffe+++;} /Cuth>只剩下15个字符。至少在C和C++中,这是完全有效的(虽然没有副作用)语句。显然这在C#中是不正确的。事实证明,正确的答案是按照@sth的建议使用一个虚拟赋值。这是一个很好的解释,因为如果你考虑三元函数是如何工作的,它的计算结果是一个单一的值,这个值是从两个选项中选择的。因此,一旦进行了评估,就如同编写了一条语句,该语句的值为
unique(递增后),或
重复类似于
12345
这不是有效的语句,因为它只是一个单独的整数。@AaronLS:首先,它将是递增之前的值,而不是递增之后的值。其次,在许多语言中,拥有一个单独的整数是完全有效的。C#在这方面是不同的。顺便说一下,我完全不知道单独的整数可以是其他语言中的语句——我知道一些。一个人不断地学习@阿贝伦基:很好的命令,我
HashSet<long> groupUIDs = new HashSet<long>();
if (groupUIDs.Add(uid))
   unique++;
else
   dupes++;