代码之家  ›  专栏  ›  技术社区  ›  puregeek

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

  •  7
  • puregeek  · 技术社区  · 7 年前

    我有以下几点 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 回复  |  直到 7 年前
        1
  •  14
  •   Kirk Woll    7 年前

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

    您想要的是:

    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 会真正实现你想要的。(并不是说它可读性很强)

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

    你唯一的错误就是C#语法不允许这样做。当然可以,但事实并非如此。有人提醒我,SQL中的when运算符是一个表达式(这意味着可以说set I=当x为null时,则为“A”或“B”),而在C中,这种用法是无效的(因为switch语句不是一个表达式,它不能返回值)

        2
  •  1
  •   Alexander Hitesh Bavaliya    7 年前

    尝试以下操作:

    int number = 1;
    int isNumber10 = (number == 10) ? 10 : 0;
    
    Console.WriteLine(isNumber10);
    
        3
  •  0
  •   puregeek    7 年前

    问题是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语言中,只有以下语句有效-

    问约翰(约翰有胡子)?(保存):(不保存);
    

    就像给定代码中的那样-

    正确的C语法-

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

    以及-

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

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

    是否数字10=(数字==10)?1:0;