[英]General C# question
下面有兩種方法,其中M1抱怨'並非所有代碼路徑都返回一個值'而M2則沒有。
問題:編譯器如何在返回值的上下文中解析M2? 如何將NotImplementedException實例隱式轉換為int(如果有任何內部編譯時間分辨率)
class A
{
int M1()
{
}
int M2()
{
throw new NotImplementedException();
}
}
返回值並不總是需要一種方法; 特別是,它也允許通過拋出異常退出(在這種情況下不返回任何值)。
編輯:具體來說,返回int
的方法體的規則是:
return
語句都必須返回一個可轉換為int
的表達式 在您的示例中,編譯器可以證明M2
總是通過拋出退出,因此方法塊的末尾不可達(滿足規則#2)。 也沒有return
聲明,也符合規則#1。 因此,這是一個有效的方法定義。
另一方面, M1
不滿足規則#2,因此不合法。
您可能會被錯誤消息誤導,但根本沒有提到丟棄,但是考慮到幾乎在所有情況下返回值的方法都return
而不是拋出 - 編譯器只是告訴您希望您可能忘記了。
異常會影響代碼流。 拋出后的任何語句都不會被執行,編譯器可以證明這一點,因此對通過該方法的路徑感到滿意。
該異常不會導致返回int
,通常意義上不會返回任何內容。 而是生成異常,CLR以不同方式處理這些異常。
http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx
該異常不會被轉換為int。 編譯器知道它是一個永遠都會達到的異常,因此不會抱怨。 當異常被命中時,它會將堆棧展開到異常處理塊或崩潰。 永遠不會將int返回給方法調用者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.