C#编译器缺陷?:无法检测到始终抛出异常的方法

6
为什么在以下情况下,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个回答

8

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

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


5
完全正确。但为了澄清原帖作者的观点,如果将方法ThrowException()改为返回一个异常,并更改代码为: throw ThrowException(),它将表现出原帖作者所想要的行为。 - Kirk Woll
1
嗯,VS 2008确实具有静态代码分析功能,否则它不会引发此错误。 - Chris
@Christopher:当我们谈论静态代码分析时,我们意味着一种更加详细的分析方式。虽然对于人类来说,您的代码将始终会抛出某些东西或返回某些东西是显而易见的,但目前对于编译器来说还不是这样。 - devoured elysium
有人能确认一下 VS 2010 的高级版是否正确处理了这个问题吗? - Chris
FYI- 在我的情况下,该方法实际上被称为ThrowWrappedException(),这是一个帮助方法,可以为异常添加更多细节。 - Chris
显示剩余2条评论

1

else分支没有return语句。这意味着当进入else分支时,Foo不会返回任何值。

为什么不这样做:

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

    return 1;
}

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


是的,我也认为这段代码更易懂。而且缩进更少。 - devoured elysium

0
错误信息已经说明了一切:并非所有的代码路径都返回一个值。我认为ThrowException()的目的是抛出异常。如果它这样做了,我可以理解为什么错误信息会看起来很奇怪。然而,请考虑接受这个有效代码的后果。如果以后更改ThrowException()的实现不再抛出异常,上面的代码将突然失败,这可能会让人大吃一惊。编译器在这里选择了安全路线。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接