2010-01-11 100 views
0

我想切换isFollowing的值。如果这是真的,我想isFollowing = false并且相反。C#条件语句

而不是我使用的'if'语句? :

 isFollowing == true ? isFollowing = false : isFollowing = true; 

但这不起作用。它给出“只有赋值,调用,递增,递减和新的对象表达式可以用作语句” 这是为什么?

在此先感谢

+8

为什么不直接使用'isFollowing = isFollowing;'? – kennytm 2010-01-11 19:30:18

+4

做正在做的事情的正确方法是'isFollowing == true?假:真;'。但是'isFollowing =!isFollowing'更简单,更直接和习惯。 – 2010-01-11 19:31:32

+0

http://stackoverflow.com/questions/237241/what-c​​oding-mistakes-are-a-telltale-giveaway-of-an-inexperienced-programmer/237247#237247 – 2010-01-11 19:32:12

回答

16

如果你想保持它作为一个三元,你可以做

isFollowing = (isFollowing == true ? false : true); 

然而,这是一个更短的等价:

isFollowing = !isFollowing; 

之所以你的代码没有工作是三元本身就是一种表达,并不是所有的表达都是有效的陈述。通过将它转换为一个三元值的赋值,它就成为一个声明。

只要符合运算符优先级规则,您的代码就很可能在C中有效,但C#不允许您这样做。作为一种惯例,最好限制你的三元分支无论如何都不要有副作用,即使语言允许你这样做。

+0

如果你打算给一个三元版本,至少给一个没有冗余的声明:'isFollowing = isFollowing? false:true;'isFollowing == true'是不必要的。 – jason 2010-01-11 19:40:57

+0

这是真的,但我试图说明他的代码的最接近的工作版本。无论如何,三元论是不必要的,这一点已被消除。 – Crast 2010-01-11 19:45:57

10

用途:

isFollowing = !isFollowing; 

要使用的三元运算符,使这项工作:

isFollowing = isFollowing ? false : true; 

但不这样做,只是使用的第一个版本。

你之所以有不工作是什么,因为三元运算符的形式

conditon ? expression_if_condition_is_true : expression_if_condition_is_false; 

的这个计算结果为表达式(expression_if_condition_is_true如果conditiontrueexpression_if_condition_is_false如果conditionfalse)。表达式不能用作语句,除非它们是方法调用,增量(即i++),递减,使用new的分配和赋值。

1

显然一个更简单的方法是:

isFollowing = !isFollowing; 

以其它方式使用:

isFollowing = isFollowing ? false : true; 
1

你得到错误的原因是,您在expresion中间有一个任务:

isFollowing == true ? isFollowing = false : isFollowing = true; 
           ^
           here 

三元运算符是一个表达式,你不能拥有这种类型的表达式本身,你需要将它分配给某些东西。

其他的答案在这里给你如何重写它的解决方案:

isFollowing = !isFollowing;