在C#三元运算符中给出错误:仅分配,呼叫,增量,减少和新对象表达式可以用作语句



我有以下C#代码 -

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

汇编给我带来了错误 -

错误CS0201:仅分配,呼叫,增量,减少和新 对象表达式可以用作语句

C中,我习惯了以下代码 -

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

此代码运行完美。

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

中运行

三元运算符是无法用作语句的表达式。相比之下,分配是将提升为陈述的表达式。(因此,错误消息是指"分配"表达式)

您想要的是:

isNumber10 = number == 10 ? 1 : 0;

在这里,您将?:操作员用作解决两个值之一(10)的表达式,然后分配给变量isNumber10

如果您创建了此方法,请对此有一点乐趣:

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

,您将其称为:

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

它可以正常工作。问题在于C#语法不允许大多数裸露的表达式生活在表达式不消耗的情况下。(请记住,表达式和陈述之间的定义差异是表达式产生表达式,但陈述不可能)在此指南之外允许某些表达式 - 例如调用返回值的方法。这些变成技术句子的"表达式"。而且,有用的是,唯一可以将可以晋升为陈述的表达式的候选人完全由您的问题标题中的错误消息描述。

我们大多数人都将作业视为陈述,但从根本上讲,这是一种表达。(它返回同时执行任务时分配的值)。这就是为什么对M的空白实际上会完成您想要的。(不是很可读)

从您的评论中,我将作为答案的一部分添加此评论:

您唯一的错误是C#语法不允许的简单事实。它当然可以,但是,它不是。我想起了SQL中的操作员是如何表达式的(这意味着您可以说i = x null null the a'''''b'),而在C#中,这样的用法将无效(因为开关语句是不是表达式 - 它无法返回值)

尝试以下:

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

在这里约翰必须被引用两次。

也有效 -

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

这里只引用了一次。

,但在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;

最新更新