【发布时间】:2017-08-08 09:32:11
【问题描述】:
就像这个例子:
public MatchResult GetResult(int home, int away)
{
if ( home == away )
return MatchResult.Draw;
else if ( home > away )
return MatchResult.HomeWins;
else if ( home < away )
return MatchResult.AwayWins;
throw new Exception("Should be impossible");
}
我知道我可以用else 作为最后一个语句来解决这个问题,但我通常更喜欢明确。当然,这是出于示例目的的简化情况。
旁边:是编译器抛出not all code paths return a value的原因,因为情况对编译器来说太复杂了或者因为其他原因(比如我们可以理论上改变@的值987654325@ 中途被来自不同线程的非托管代码或其他什么?)
【问题讨论】:
-
我看不到编译器如何从您的代码中生成该错误,因为所有分支都有返回值或至少抛出异常。但是,您的第一个问题非常基于意见,因此将被关闭。无论如何:一个参数怎么可能既不相等,又不大于或小于另一个?您认为如何才能达到例外?
-
话虽如此,ReSharper 等代码分析工具可能会将您的异常代码标记为无法访问,您应该将其删除。
-
ReSharper 也不会检测到这一点,只是对其进行了测试。
-
情况其实并不算太复杂,但是编译器是故意保守的。即使是像
int a = 1; if (a > 0) return 0;这样在方法中没有任何其他内容的微不足道的东西也会被标记,即使代码显然总是返回。确切的规则是documented。 -
@LasseV.Karlsen 事实上,ReShaper 在我们只有
if-statements 的事实上苦苦挣扎。从最后一个else中删除if将使其找到问题。
标签: c# exception compilation