在C#三元运算符给出错误:只有赋值,调用,递增,递减和新对象表达式可用作语句

我有以下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#中运行呢?

最佳答案
三元运算符是一个不能用作语句的表达式.相反,赋值是一个可以提升为语句的表达式. (因此引用“赋值”表达式的错误消息)

你想要的是:

isNumber10 = number == 10 ? 1 : 0;

在这里,您使用?:运算符作为表达式,解析为两个值之一(1或0),然后分配给变量isNumber10.

为了获得一点乐趣,如果你创建了这个方法:

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

你称之为:

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

它会工作正常.问题只是C#语法不允许大多数裸表达式存在于不消耗表达式值的上下文中. (请记住,表达式和语句之间的定义差异是表达式生成表达式,但语句不生成)某些表达式在本指南之外是允许的 – 例如,调用返回值的方法.这些在技术术语中变成了“expression statement”.有用的是,可以提升为语句的表达式的唯一候选者正是由问题标题中的错误消息准确描述的.

我们大多数人都将作业视为陈述,但它更基本上是一种表达. (它返回在同时执行分配时分配的值).这就是为什么对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)

转载注明原文:在C#三元运算符给出错误:只有赋值,调用,递增,递减和新对象表达式可用作语句 - 代码日志