我遇到了一种情况,即 non-void 方法 缺少 return 语句并且代码仍然可以编译。 我知道 while 循环之后的语句是 unreachable (死代码)并且永远不会被执行。但是为什么编译器甚至不警告返回一些东西呢?或者为什么一种语言允许我们拥有一个具有无限循环并且不返回任何内容的非 void 方法?
public int doNotReturnAnything() {
while(true) {
//do something
}
//no return statement
}
如果我在 while 循环中添加一个 break 语句(甚至是条件语句),编译器会提示臭名昭著的错误:Method does not return a value
in Eclipse 和 Not all code路径在 Visual Studio 中返回一个值
。
public int doNotReturnAnything() {
while(true) {
if(mustReturn) break;
//do something
}
//no return statement
}
Java 和 C# 都是如此。
最佳答案
Why would a language allow us to have a non-void method having an infinite loop and not returning anything?
非 void 方法的规则是每个返回的代码路径都必须返回一个值,并且该规则在您的程序中得到满足:返回的代码路径中有零个返回值。规则不是“每个非 void 方法都必须有一个返回的代码路径”。
这使您可以编写 stub 方法,例如:
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
这是一个非 void 方法。为了满足接口(interface),它必须是一个非空方法。但是将这个实现设为非法似乎很愚蠢,因为它不返回任何东西。
你的方法因为 goto
而有一个无法到达的终点(请记住,while(true)
只是写 goto< 的一种更愉快的方式
) 而不是 throw
(这是 goto
的另一种形式) 是不相关的。
Why doesn't the compiler even warn about returning something?
因为编译器没有很好的证据证明代码是错误的。有人写了 while(true)
并且这样做的人似乎很可能知道他们在做什么。
Where can I read more about reachability analysis in C#?
在此处查看我关于该主题的文章:
ATBG: de facto and de jure reachability
您还可以考虑阅读 C# 规范。
关于java - 非 void 方法中缺少 return 语句编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16789832/