微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/csharp/97464.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐