三元“?:运算符”在 C# 中是否有错误
本文关键字:是否 有错误 运算符 三元 | 更新日期: 2023-09-27 18:35:28
为什么我不能运行以下代码?
static int num = 0;
static void Main(string[] args)
{
(num == 0) ? inc() : dec();
}
public static void inc()
{
num++;
}
public static void dec()
{
num--;
}
为什么 C# 不允许我使用三元 "?:" 运算符来检查条件,然后相应地运行方法,而无需返回任何值? 相当于这个:
if (num == 0) inc();
else dec();
我不确定相同的规则是否适用于其他语言,例如 Java、C++ 等......
为什么我不能运行以下代码?
因为你试图违反语言规范。条件运算符的操作数(C# 4 规范中的第 7.14 节)必须是表达式 - 并且调用返回类型为 void
的方法明确"仅在语句表达式的上下文中有效"(请参阅 C# 4 规范的第 7.1 节)。
运算符的目的是提供一个表达式,该表达式是基于条件计算两个表达式之一的结果。它不是根据条件执行两个操作之一。只需使用if
语句。
同样,条件运算符本身也不会形成有效的语句,就像其他各种运算符一样:
a + b; // Invalid
x = a + b; // Valid, assignment expression can be an expression-statement
明确来自规范的第 8.6 节:
并非所有表达式都允许作为语句。特别是,不允许将仅计算值(将被丢弃)的表达式(如
x + y
和x == 1
)作为语句。
Jon Skeet的回答完美地记录了C#故意走C++不同的路线。 很难说为什么,但我会尝试,因为我相信这个问题也应该得到答案。
C#与C++和Java共享许多语法。 在这种情况下,选择了Java方式。 这既涉及无法将2 + 2;
编写为独立语句,也涉及要求三元运算符返回值。
我相信这两个决定都与消除无法访问的代码有很大关系。 2 + 2
中的+
运算符可以优化掉,因此,如果它在代码中有任何用途,则该用途是不可靠的! 理想情况下,静态分析(编译错误或警告)应该告诉您在这种情况下似乎存在语义问题,并强制您删除或重写无法访问的代码。
因此,表达式不再总是语句,需要为 Java/C# 重新定义 C 语法,表达式始终返回值,语句从不返回值。
现在?:
和if
- else
主要区别在于一个是表达式,一个是陈述,至少在它们的典型用法上是这样。 因此,重新定义的语法只是选择禁止无效三元,并为此目的推荐if
- else
。
因为三元运算符根据布尔表达式分配值。它的基本 C# 规范。如果你的方法是一个 void 返回类型,那么最好是使用 if - else 或切换大小写。
int a = true ? 0 : 1; //Always works
true ? 0 : 1; //This will never work.
或者你的例子修改了一点。
static int num = 0;
static void Main(string[] args)
{
num = (num == 0) ? inc(num) : dec(num);
}
public static int inc(int lnum)
{
return lnum + 1;
}
public static int dec(int lnum)
{
return lnum - 1;
}
条件运算符 (?:) 根据布尔表达式的值返回两个值之一。
它没有按照您在问题中描述的方式行事。以下是三元运算符的更多字节
http://msdn.microsoft.com/en-us/library/ty67wk28%28v=vs.80%29.aspx
但是当以这种方式使用时,它会起作用:
static int num = 0;
static void Main(string[] args)
{
num = (num == 0) ? inc(num) : dec(num);
}
public static int inc(int number)
{
return number + 1;
}
public static int dec(int number)
{
return number - 1;
}