我遇到了这样一种情况:非 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 and 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();
}
这是一个非空方法。它必须是非空方法才能满足接口(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/37425349/