来自Systems.Collections.Generic.Dictionary类的以下函数在抛出异常后有返回语句,有没有人知道为什么?
public TValue this[TKey key] {
get {
int i = FindEntry(key);
if (i >= 0) return entries[i].value;
ThrowHelper.ThrowKeyNotFoundException();
**return default(TValue);**
}
set {
Insert(key, value, false);
}
}
答案 0 :(得分:7)
即使
ThrowHelper.ThrowKeyNotFoundException();
当然会抛出异常,编译器不够复杂,无法证明它从不做其他任何事情。由于它不能证明该函数永远不会返回,因此必须假设它可以返回。
Eric Lippert刚刚在他的博客上完成了一个关于这个问题的“永不言败”的迷你系列。
http://blogs.msdn.com/b/ericlippert/archive/2011/02/21/never-say-never-part-one.aspx
事实证明,这是Halting Problem的一个简单案例,已经证明它对图灵机不可判。
答案 1 :(得分:3)
它被迫,因为该方法本身不是直接抛出,ThrowHelper是。编译器无法知道这一点,因此为了满足编译器,添加了return default(TValue);
,即使它永远不会被调用。