2011-09-13 96 views
6

下面的類有兩種方法,其中M1抱怨'不是所有的代碼路徑都返回一個值',而M2沒有。一般C#問題

問題:編譯器如何在返回值的上下文中解析M2?如何將NotImplementedException實例隱式轉換爲int(如果有任何內部編譯時間分辨率)

class A 
     { 
      int M1() 
      { 
      } 
      int M2() 
      { 
       throw new NotImplementedException(); 
      } 
     } 
+0

一般Seesharp(致敬) SWeko

+0

我似乎無法找到C#規範中描述此過程的位置,任何人都可以指出這一點? – SWeko

+1

@Sekeko:追蹤它。這裏:http://msdn.microsoft.com/en-us/library/aa664437(VS.71).aspx(最後一段)。 – Jon

回答

7

的方法並不總是需要返回一個值;尤其是,它也可以通過拋出異常退出(在這種情況下,不返回任何值)。

編輯:具體地說,the rules for the body of a method返回int是:

  1. 在該方法中所有return語句必須返回轉換表達式來int
  2. 的方法塊的末端必須是不可到達的

在你的例子中,編譯器可以證明M2總是通過拋出,所以方法塊的結尾是不可達的(滿足規則#2)。也沒有return陳述,它也滿足規則#1。因此這是一個有效的方法定義。

另一方面,M1不符合規則#2,因此它是不合法的。

您可能誤導了沒有提及拋出的錯誤消息,但認爲在幾乎所有情況下,返回值的方法都會執行return而不是拋出 - 編譯器只是告訴您希望您可能忘記了。

+0

aw快速爲我的WP7鍵盤。 –

2

異常會影響代碼的流向。拋出後的任何語句都不會被執行,編譯器可以證明這一點,因此對通過該方法的路徑感到滿意。

該異常不會導致返回int,在正常意義上不會返回任何東西。相反,生成一個異常,CLR處理這些異常。

http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

0

該異常將不會被轉換爲int。編譯器知道這是一個總是會遇到的異常,所以不會抱怨。當異常被觸發時,它會將堆棧解壓縮到異常處理塊或崩潰。一個int永遠不會被返回給方法調用者。

0

MSDN所述,

throw語句被用於用信號通知的程序執行過程中異常的情況(異常)的發生。

當代碼執行碰上聲明,程序停止,顯示異常信息給用戶(如果程序員沒有指定任何錯誤處理邏輯)