在非void方法中缺少return语句编译

问题:

我遇到一个非void方法缺少返回语句并且代码仍然编译的情况。
我知道while循环之后的语句是无法访问(死代码),永远不会被执行。但是为什么编译器甚至不会回复什么呢?或者为什么语言允许我们有一个无效的方法有无限循环,不返回任何东西?

public int doNotReturnAnything() {
    while(true) {
        //do something
    }
    //no return statement
}

如果我在while循环中添加了一个break语句(甚至是一个条件语句),那么编译器会抱怨臭名昭着的错误:“方法不返回值”(Eclipse)和“不是所有代码路径返回一个值”(Visual Studio)

public int doNotReturnAnything() {
    while(true) {
        if(mustReturn) break;
        //do something
    }
    //no return statement
}

Java和C#都是这样的

回答:

为什么一种语言可以让我们有一个无效的方法有无限循环,没有返回任何东西?

非void方法的规则是every code path that returns must return a value,并且该规则在您的程序中得到满足:返回值为零的零路径中的零将返回值。规则不是“每个非void方法都必须有一个返回的代码路径”。
这使您可以编写存根方法,如:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    throw new NotImplementedException(); 
}

这是一个无效的方法。为了满足接口,它has是一个非void方法。但是,由于不执行任何操作,因此执行非法操作似乎很愚蠢。
你的方法有一个无法达到的终点,因为goto(记住,while(true)只是一个更愉快的方式写goto)而不是throw(这是另一种形式的goto)不相关。

为什么编译器甚至不会回复什么呢?

因为编译器没有很好的证据表明代码是错误的。有人写了while(true),似乎有人知道他们在做什么。

在哪里可以阅读更多关于C#中的可达性分析?

在这里我看到我的文章:
 ATBG: de facto and de jure reachability
您也可以考虑阅读C#规范。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Missing return statement in a non-void method compiles

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

53 + = 59