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#三元运算符给出错误:只有赋值,调用,递增,递减和新对象表达式可用作语句全部内容,希望文章能够帮你解决在C#三元运算符给出错误:只有赋值,调用,递增,递减和新对象表达式可用作语句所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)