C#编译器缺陷?:不检测总是抛出异常的方法

时间:2010-08-14 13:11:15

标签: c# compiler-construction

为什么MS C#编译器会在以下情况中抱怨“并非所有代码路径都返回值”?

public int Foo(bool flag)
{
    if(flag)
    {
        return 1;
    }
    else
    {
        ThrowException(); // this method always throws an exception

        // return -1; // why do I need to add this code that will never be called?
    }
}

谢谢!

3 个答案:

答案 0 :(得分:8)

无法猜测ThrowException()是一个始终抛出异常的方法。为此,您需要进行静态代码分析。

静态代码分析在VS 2010中可用,但我认为仅适用于更昂贵的VS版本。

答案 1 :(得分:1)

else分支没有return语句。这意味着Foo在输入else分支时不会返回值。

你为什么不这样做:

public int Foo(bool flag)
{
    if (!flag) {
        ThrowException();
    }

    return 1;
}

顺便说一下,我总觉得应该先进行验证。

答案 2 :(得分:0)

错误消息说明了一切:并非所有代码路径都返回一个值。我认为ThrowException()的目的是抛出异常。如果它这样做,我可以看到错误消息看起来如何奇怪。但是,请考虑接受此有效代码的后果。如果ThrowException()的实现稍后被更改为不再抛出异常,则上面的代码会突然失败,这可能会让人大吃一惊。编译器正在选择安全之路。