2011-03-02 72 views
6

以下函數從System.Collections.Generic.Dictionary類拋出異常後有return語句,請問有沒有人知道爲什麼?在C#中拋出異常後返回語句#

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); 
     } 
    } 
+1

最近由Eric Lippert覆蓋:http://blogs.msdn.com/b/ericlippert/archive/2011/02/24/never-say-never-part-two.aspx?wa=wsignin1.0 – 2011-03-02 21:02:11

回答

7

即使

ThrowHelper.ThrowKeyNotFoundException(); 

肯定不會拋出異常,編譯器是不夠成熟的證明,它會永遠做別的。並且因爲它不能證明該函數永不返回,所以必須假定它可以返回

Eric Lippert剛剛在他的博客上寫了一個題爲「Never Say Never」的迷你係列講述這個問題。

http://blogs.msdn.com/b/ericlippert/archive/2011/02/21/never-say-never-part-one.aspx

事實證明,這是Halting Problem的一個簡單的例子,這已被證明是過度圖靈機判定的。

+0

就像在try {}塊中添加return語句一樣,編譯器假定該方法沒有返回,並引發編譯時錯誤。我認爲編譯器應該能夠弄清楚是否有一個throwhelper(派生自基類Exception)並引發相同的編譯錯誤? – Kumar 2011-03-02 21:27:54

3

它被迫,因爲該方法本身並不直接拋出,ThrowHelper是。編譯器無法知道這一點,所以爲了滿足編譯器的需要,return default(TValue);被添加,即使它永遠不會被調用。