In C# ternary operator giving error: Only assignment, call, increment, decrement, and new object expressions can be used as a statement

In C# ternary operator giving error: Only assignment, call, increment, decrement, and new object expressions can be used as a statement

我有以下 C# 代码 -

using System;

class Program 
{
    static void Main()  
    {
        int number = 1;
        int isNumber10;
        (number==10)?(isNumber10=1):(isNumber10=0);
        Console.WriteLine(isNumber10);
    }
}

编译时出现错误 -

error CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement

C我习惯了下面的代码-

#include <stdio.h>
int main(){
    int isNumber10;
    int number = 1;
    (number==10)?(isNumber10=1):(isNumber10=0);
    printf("%d\n",isNumber10);
    return 0;
}

这段代码 运行 非常完美。

现在,这两个程序完全一样了。那么为什么它在 C 中是 运行 而在 C# 中不是?

三元运算符是不能用作语句的表达式。相反,赋值是 可以 提升为语句的表达式。 (因此错误消息指的是 "assignment" 表达式)

你想要的是:

isNumber10 = number == 10 ? 1 : 0;

此处您使用 ?: 运算符作为解析为两个值之一(10)的表达式,然后分配给变量 isNumber10.

为了玩得开心,如果您创建了这个方法:

public void M<T>(T value)
{
}

你这样称呼它:

M((number==10)?(isNumber10=1):(isNumber10=0));

它会很好用。问题只是 C# 语法不允许大多数裸表达式存在于表达式值不被消耗的上下文中。 (请记住,表达式和语句之间的定义区别在于表达式产生表达式,而语句不会)一些表达式在本指南之外是允许的——例如调用一个方法 returns 一个值。这些在技术术语中变成了“expression statement”。有用的是,唯一可以提升为语句的表达式候选者由问题标题中的错误消息准确描述。

我们大多数人都将赋值视为语句,但它更根本上是一种表达式。 (它 returns 在执行分配的同时分配的值)。这就是为什么对 M 的空调用实际上会完成您想要的。 (并不是说它的可读性很强)

根据您的评论,我会将此评论添加为我的回答的一部分:

The only error of yours is the simple fact that the C# grammar doesn't allow it. It certainly could, but well, it does not. I'm reminded about how the when operator in SQL is an expression (meaning you can say set i = when x is null then 'A' else 'B') whereas in C# such a usage would be invalid (since the switch statement is not an expression -- it cannot return a value)

试试这个:

int number = 1;
int isNumber10 = (number == 10) ? 10 : 0;

Console.WriteLine(isNumber10);

问题是C语法和C#语法不一样。

我举个简单的例子 -

有一个人约翰

在 C 中,以下语句有效 -

(John has beard)?(Ask John to save):(ask John to not save);

这里必须提到 John 两次。

下面的说法也是有效的 -

Ask John to = (John has beard)? (save):(not save);

此处仅提及 John 一次。

但在 C# 中只有以下语句有效 -

Ask John to = (John has beard)? (save):(not save);

就像给定的代码中那样 -

正确的 C 语法 -

(number==10)?(isNumber10=1):(isNumber10=0);

以及-

isNumber10 = (number==10)? 1:0;

但在 C# 中只有以下语法是正确的 -

isNumber10 = (number==10)? 1:0;