三元“?:运算符”在 C# 中是否有错误

本文关键字:是否 有错误 运算符 三元 | 更新日期: 2023-09-27 18:35:28

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

    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++ 等......

三元“?:运算符”在 C# 中是否有错误

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

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

条件

运算符的目的是提供一个表达式,该表达式是基于条件计算两个表达式之一的结果。它不是根据条件执行两个操作之一。只需使用if语句。

同样,条件运算符本身也不会形成有效的语句,就像其他各种运算符一样:

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

明确来自规范的第 8.6 节:

并非所有表达式都允许作为语句。特别是,不允许将仅计算值(将被丢弃)的表达式(如 x + yx == 1)作为语句。

Jon Skeet的回答完美地记录了C#故意走C++不同的路线。 很难说为什么,但我会尝试,因为我相信这个问题也应该得到答案。

C#与C++和Java共享许多语法。 在这种情况下,选择了Java方式。 这既涉及无法将2 + 2;编写为独立语句,也涉及要求三元运算符返回值。

我相信这两个决定都与消除无法访问的代码有很大关系。 2 + 2中的+运算符可以优化掉,因此,如果它在代码中有任何用途,则该用途是不可靠的! 理想情况下,静态分析(编译错误或警告)应该告诉您在这种情况下似乎存在语义问题,并强制您删除或重写无法访问的代码。

因此,表达式不再总是语句,需要为 Java/C# 重新定义 C 语法,表达式始终返回值,语句从不返回值。

现在?:if - else主要区别在于一个是表达式,一个是陈述,至少在它们的典型用法上是这样。 因此,重新定义的语法只是选择禁止无效三元,并为此目的推荐if - else

因为三元运算符根据布尔表达式分配值。它的基本 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;
}

条件运算符 (?:) 根据布尔表达式的值返回两个值之一。

它没有按照您在问题中描述的方式行事。以下是三元运算符的更多字节

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

但是当以这种方式使用时,它会起作用:

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;
}