我遇到 非空方法 缺少 return 语句且代码仍可编译的情况。我知道while循环之后的语句是 不可达的 (死代码)并且永远不会执行。但是,为什么编译器甚至不警告返回内容?还是为什么一种语言允许我们拥有一个具有无限循环并且不返回任何东西的非空方法?
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#都是如此。
为什么一种语言允许我们使用具有无限循环且不返回任何内容的非空方法?
非无效方法的规则是 ,返回的每个代码路径都必须返回一个值 ,并且该规则在您的程序中得到满足:返回的零个代码路径中的零个确实返回一个值。规则不是“每个非无效方法都必须具有返回的代码路径”。
这使您可以编写如下的存根方法:
IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); }
那是一种非无效的方法。为了满足接口,它 必须 是非无效方法。但是使该实现非法是愚蠢的,因为它不返回任何东西。
由于goto(记住,a while(true)只是一种更舒适的编写方式goto)而不是throw(是的另一种形式goto),因此您的方法具有无法到达的终点是无关紧要的。
goto
while(true)
throw
为什么编译器甚至不警告返回某些内容?
因为编译器没有很好的证据证明代码是错误的。有人写信while(true),看来这样做的人很可能知道他们在做什么。
在哪里可以阅读有关C#中的可达性分析的更多信息?
在这里查看我关于该主题的文章:
ATBG:事实上和法律上的可及性
您也可以考虑阅读C#规范。