Emo*_*Emo 2 c# java ternary-operator
为什么我不能运行以下代码?
static int num = 0;
static void Main(string[] args)
{
(num == 0) ? inc() : dec();
}
public static void inc()
{
num++;
}
public static void dec()
{
num--;
}
Run Code Online (Sandbox Code Playgroud)
为什么C#不允许我使用三元"?:"运算符来检查条件然后相应地运行一个方法而不需要返回任何值?与此等效:
if (num == 0) inc();
else dec();
Run Code Online (Sandbox Code Playgroud)
我不确定是否在其他语言中应用了相同的规则,例如Java,C++等...
Jon*_*eet 26
为什么我不能运行以下代码?
因为你试图违反语言规范.条件运算符(在C#4规格部分7.14)的操作数必须是表达 -并用的返回类型的方法的调用void明确为"仅在一个语句表达的上下文中有效"(见7.1节C#4规范).
条件运算符的目的是提供一个表达式,该表达式是基于条件评估两个表达式之一的结果.它不是基于条件执行两个动作之一.只需使用一份if声明.
同样,条件运算符本身不构成有效语句,不仅仅是其他各种运算符:
a + b; // Invalid
x = a + b; // Valid, assignment expression can be an expression-statement
Run Code Online (Sandbox Code Playgroud)
明确地从规范的第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为此目的.
| 归档时间: |
|
| 查看次数: |
886 次 |
| 最近记录: |