为什么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?
}
}
谢谢!
答案 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()
的实现稍后被更改为不再抛出异常,则上面的代码会突然失败,这可能会让人大吃一惊。编译器正在选择安全之路。