2011-07-15 148 views
2

这个看似简单的代码有什么问题?三元运算符用法

invoice.GST > gstValue ? invoice.GST -= gstValue : invoice.GST = 0; 

VS抱怨
只有转让,电话,递增,递减和新对象表达式可以用作声明

+3

三元操作就是这样,运营商,而不是语句(如IF)。 – mletterle

+0

是的。我知道它是一个操作员,我在这个问题中写了它,但我仍然把它当作一个声明来处理!上帝救我... –

回答

6

试试这个:

invoice.GST = ((invoice.GST>gstValue)?(invoice.GST - gstValue):0); 
+0

这工作'invoice.GST =(invoice.GST> gstValue)? (invoice.GST - = gstValue):0;'感谢Cyber​​nate! –

+0

@Reddy:很高兴帮助 – Chandu

+1

@Reddy:它的工作原理是因为' - ='运算符返回被赋值的值。你可以把' - ='改成'-',它会有相同的效果(而且看起来不那么奇怪)。 – cHao

3

因为你不能使用invoice.GST > gstValue ? invoice.GST -= gstValue : invoice.GST = 0;作为声明(如VS告诉你的)。同样喜欢你不能做到这一点:int i = 0; i;

你可以写为:invoice.GST = Math.Max(0, invoice.GST - gstValue);

1
invoice.GST = invoice.GST > gstValue ? invoice.GST - gstValue : 0; 

三元操作就像-+和其他运营商。

0

提到的表达式可以用作语句,因为它们会导致副作用。

通常,没有副作用的操作作为语句没有任何意义,因为删除操作符和仅评估操作数会产生相同的效果,这些通常表明行为不是程序员所期望的。

例外情况是有条件评估操作数的三个操作符(其他两个是&&||) - 消除操作符和操作数更改的副作用。在C和C++中,您有时会发现这些运算符仅用于进行条件评估,但C#不允许这样做。在所有三种情况下,条件评估都可以使用if语句获得,这也使得代码更具可读性。

0

试试这个:

invoice.GST -= invoice.GST > gstValue ? gstValue : invoice.GST;