我遇到了一种情况,即 非 void 方法 缺少 return 语句并且代码仍然可以编译。我知道 while 循环之后的语句是 无法访问 的(死代码)并且永远不会被执行。但是为什么编译器甚至不警告返回一些东西呢?或者为什么一种语言允许我们拥有一个具有无限循环并且不返回任何内容的非 void 方法?
public int doNotReturnAnything() { while(true) { //do something } //no return statement }
如果我在 while 循环中添加 break 语句(甚至是条件语句),编译器会抱怨臭名昭著的错误:Method does not return a value在 Eclipse 和Not all code paths return a valueVisual Studio 中。
Method does not return a value
Not all code paths return a value
public int doNotReturnAnything() { while(true) { if(mustReturn) break; //do something } //no return statement }
Java 和 C# 都是如此。
为什么一种语言允许我们拥有一个具有无限循环且不返回任何内容的非 void 方法?
非 void 方法的规则是 每个返回的代码路径都必须返回一个值 ,并且该规则在您的程序中得到满足:返回的代码路径中有零个返回值。规则不是“每个非 void 方法都必须有一个返回的代码路径”。
这使您可以编写存根方法,例如:
IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); }
那是一种非无效的方法。为了满足接口,它 必须 是非 void 方法。但是将这个实现设为非法似乎很愚蠢,因为它不返回任何东西。
goto由于 a (记住,awhile(true)只是一种更愉快的编写方式goto)而不是 a throw(这是 的另一种形式),因此您的方法具有无法到达的终点goto是不相关的。
goto
while(true)
throw
为什么编译器甚至不警告返回一些东西?
因为编译器没有很好的证据证明代码是错误的。有人写道while(true),似乎这样做的人知道他们在做什么。
在哪里可以阅读有关 C# 中可达性分析的更多信息?
在此处查看我关于该主题的文章:
ATBG:事实上和法律上的可达性
您还可以考虑阅读 C# 规范。