簡體   English   中英

一般C#問題

[英]General C# question

下面有兩種方法,其中M1抱怨'並非所有代碼路徑都返回一個值'而M2則沒有。

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

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

返回值並不總是需要一種方法; 特別是,它也允許通過拋出異常退出(在這種情況下不返回任何值)。

編輯:具體來說,返回int 的方法體的規則是:

  1. 方法中的所有return語句都必須返回一個可轉換為int的表達式
  2. 必須無法訪問方法塊的末尾

在您的示例中,編譯器可以證明M2總是通過拋出退出,因此方法塊的末尾不可達(滿足規則#2)。 也沒有return聲明,也符合規則#1。 因此,這是一個有效的方法定義。

另一方面, M1不滿足規則#2,因此不合法。

您可能會被錯誤消息誤導,但根本沒有提到丟棄,但是考慮到幾乎在所有情況下返回值的方法都return而不是拋出 - 編譯器只是告訴您希望您可能忘記了。

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

該異常不會導致返回int ,通常意義上不會返回任何內容。 而是生成異常,CLR以不同方式處理這些異常。

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

該異常不會被轉換為int。 編譯器知道它是一個永遠都會達到的異常,因此不會抱怨。 當異常被命中時,它會將堆棧展開到異常處理塊或崩潰。 永遠不會將int返回給方法調用者。

MSDN中所述

throw語句用於在程序執行期間發出異常情況(異常)的信號。

當代碼執行運行到throw語句時,程序停止並向用戶顯示異常消息(如果程序員沒有指定任何錯誤處理邏輯)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM