请问三元“:运营商”在C#中的错误?(Does the ternary “?: operator”

2019-09-17 14:20发布

为什么我不能运行下面的代码?

    static int num = 0;
    static void Main(string[] args)
    {
        (num == 0) ? inc() : dec();
    }
    public static void inc()
    {
        num++; 
    }
    public static void dec()
    {
        num--;
    }

为什么不C#允许我使用三元“:”操作符来检验一个条件,然后相应地运行的方法,而无需返回任何价值? 等价于这个:

            if (num == 0) inc();
            else dec();

我不知道如果在其他语言,例如,Java,C ++等应用相同的规则...

Answer 1:

乔恩斯基特的回答是完全记录,C#语言故意去比C不同的路线++。 这是很难说为什么 ,但我会努力,因为我认为,这个问题应该有自己的答案了。

C#共享了很多与C ++和Java语法的。 在这种情况下,选择了Java的方式。 这涉及两个不能书写2 + 2; 作为一个独立的声明,以及要求三元运算符返回一个值。

我相信,这两个决定的有很多事情要做消除无法访问代码。 该+在运营2 + 2可以被优化掉,因此,如果在代码中提供的任何目的,这个目的是不可靠送达! 静态分析(编译错误或警告)应该理想地告诉你,有似乎是在这种情况下,语义问题,并迫使你删除或重写不可访问代码。

所以,表情也不再总是语句,而C语法需要重新定位为Java / C#,用表情总是返回值,并声明从未返回值。

现在?:if - else在一个是表达,一个是声明,至少在他们的典型用途主要区别。 因此,重新定义语法简单地选择了禁空ternaries和建议if - else用于这一目的。



Answer 2:

为什么我不能运行下面的代码?

因为你试图违反语言规范。 条件运算符(在C#4规格部分7.14)的操作数必须是表达式 -并用的返回类型的方法的调用void明确为“仅在一个语句表达的上下文中有效”(见第7.1节的C#4规范的)。

条件运算符的目的是提供对于评估基于条件两个表达式中的一个的结果的表达式。 这是执行的基于条件的两个动作之一。 只需使用一个if语句。

同样,有条件的经营者没有形成自身有效的声明,任何超过其他各种运营商做的:

a + b; // Invalid
x = a + b; // Valid, assignment expression can be an expression-statement

显式地从规范的第8.6节:

并非所有的表情都允许作为语句。 特别地,表述如x + yx == 1 ,仅仅计算值(其将被丢弃),不能用作语句。



Answer 3:

因为三元操作符分配基于布尔表达式的值。 它的基本C#规格。 如果你的方法返回void类型的话,最好是使用if - else或开关的情况下。

int a = true ? 0 : 1; //Always works

true ? 0 : 1; //This will never work.

或者你的例子,改装了一点。

static int num = 0;

static void Main(string[] args)
{
    num = (num == 0) ? inc(num) : dec(num);
}

public static int inc(int lnum)
{
    return lnum + 1;
}

public static int dec(int lnum)
{
    return lnum - 1;
}


Answer 4:

条件运算符(?:)返回取决于布尔表达式的值的两个值中的一个。

它不采取行动,你已经在你的问题中描述的方式。 这里是三元运营商更多的字节

http://msdn.microsoft.com/en-us/library/ty67wk28%28v=vs.80%29.aspx



Answer 5:

但是,使用这种方法时,它会工作:

static int num = 0;
static void Main(string[] args)
{
    num = (num == 0) ? inc(num) : dec(num);
}
public static int inc(int number)
{
    return number + 1;
}
public static int dec(int number)
{
    return number - 1;
}


文章来源: Does the ternary “?: operator” have a bug in C#?