当函数的逻辑确实返回时,如何处理"并非所有代码路径返回值"

Bre*_*ent 7 c# unreachable-code

我想最简单的解释方法是一个人为的例子:

public static int Fail() {
    var b = true;
    if (b) {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码不会编译,并给出错误"并非所有代码路径都返回一个值",而我们人类可以清楚地看到它确实存在.我明白为什么.我的问题是应该采取什么措施来纠正这种情况.它可能是这样的:

public static int Fail() {
    var b = true;
    if (b) {
        return 0;
    }
    throw new ApplicationException("This code is unreachable... but here we are.");
}
Run Code Online (Sandbox Code Playgroud)

但这一切似乎都很愚蠢.有没有更好的办法?同样,这段代码是一个人为的例子(可以简化为return 0).我的实际代码是庞大而复杂的,但逻辑上(通过数学证明)在尝试退出之前返回一个值.

Jar*_*Par 8

C#代码流分析是有限的,并且您的示例指出有些情况下所有路径都返回但编译器无法检测到它.在这种情况下,抛出例外是可以接受的补救措施.

我不会使用返回默认值来修复此错误.你假设线路永远不会受到编译器的建议的影响而运行.考虑一下你的分析是错误的,执行可以继续到方法的最后.如果返回默认值,则表示没有问题.该方法只会返回错误的数据.抛出异常将使问题非常明显.

但是在这些情况下,我的首选是简单地重写代码,以便编译器可以看到所有路径都终止.一般来说,我发现如果方法太复杂,以至于编译器无法遵循它,那么在我之后获取代码的人也无法跟随它.