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

时间:2017-12-21 01:23:54

标签: c# boolean ternary-operator

我有以下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("%d\n",isNumber10);
    return 0;
}

此代码运行正常。

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

3 个答案:

答案 0 :(得分:11)

三元运算符是一个不能用作语句的表达式。相反,赋值是可以被提升为语句的表达式。 (因此错误消息引用&#34;赋值&#34;表达式)

你想要的是:

isNumber10 = number == 10 ? 1 : 0;

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

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

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

你称之为:

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

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

我们大多数人都将作业视为陈述,但它更基本上是一种表达。 (它返回在同时执行分配时分配的值)。这就是为什么对M的空呼叫实际上会实现你想要的。 (并不是说它非常易读)

根据您的评论,我会在评论中添加此评论:

  

你的唯一错误就是C#语法不允许的简单事实。它当然可以,但是,它没有。我提醒过关于SQL中的when运算符是一个表达式(意思是你可以说set i =当x为null然后&#39; A&#39;其他&#39; B&#39;)而在C#中这样的用法将是无效的(因为switch语句不是表达式 - 它不能返回值)

答案 1 :(得分:1)

试试这个:

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

Console.WriteLine(isNumber10);

答案 2 :(得分:0)

问题是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;