解決與本地函數相關的錯誤與警告

本文涵蓋下列編譯器錯誤和警告:

  • CS8108:無法將具有動態型別的引數傳遞給區域函式 'method' 的 params 參數 'parameter'。
  • CS8112: 本地函式「方法」必須宣告一個實體,因為它沒有標記為「靜態外部」。
  • CS8321: 本地函式「方法」被宣告但從未使用
  • CS8421: 靜態的本地函式不能包含對「變數」的引用。
  • CS8422: 靜態的本地函式不能包含對「這個」或「基」的引用。

本地函式則在 C# 7.0 中加入。 這讓你可以在另一個成員內部宣告輔助方法。 本文的診斷涵蓋了本地函式宣告、呼叫、使用情況,以及本地 static 函數的額外擷取限制。

局部功能體

  • CS8112: 本地函式「方法」必須宣告一個實體,因為它沒有標記為「靜態外部」。

局部函數宣告必須包含一個實體,除非局部函數被宣告 static extern為 。 在本地函式中加入區塊體或表達體。 若實作是外部提供的,標記本地函式 static extern 並確保宣告符合外部方法的規則。

params 參數與動態引數

  • CS8108:無法將動態型別的引數傳遞給區域函式 'method' 的 params 參數 'parameter'。

區域函式呼叫無法將 dynamic 引數傳遞給 params 參數。 在呼叫前,將該值轉換為參數預期 params 的元素類型或陣列類型。 你也可以把值存在明確型別的陣列裡,然後把這個陣列傳給本地函式。

未使用的局部函數

  • CS8321: 本地函式「方法」被宣告但從未使用

當你宣告區域函式,但沒有任何可到達的程式碼呼叫它時,編譯器就會報告這項警告。 移除未使用的本地函式,或從包圍成員中呼叫它。 如果你打算未來在變更中使用本地函式,請先把它放在原始碼之外,直到需要再用。

靜態的局部函數無法捕捉狀態

  • CS8421: 靜態的本地函式不能包含對「變數」的引用。
  • CS8422: 靜態的本地函式不能包含對「這個」或「基」的引用。

static本地函式無法從包圍範圍擷取狀態。 它不能參考外圍的區域變數、參數、透過 this 存取的執行個體成員,或 this 本身。 將每個本地函數所需的值作為參數傳遞(CS8421, CS8422)。 如果本地函式必須從包圍範圍擷取變數或實例狀態,請移除修 static 飾符。

下列範例顯示了會導致 CS8422 的參考項目:

public class C
{
    private int counter = 1;

    public void IncreaseCounter()
    {
        static void LocalFunc(int addition)
        {
            this.counter += addition;   // CS8422
            base.ToString();            // CS8422

            counter += addition;        // CS8422: implicit this
            ToString();                 // CS8422: implicit base
        }

        LocalFunc(10);
    }
}

要修復 CS8422,請將所需的實例資料傳給本地函式,將輔助器移出實例上下文,或在本地函式必須存取實例狀態時移除 static 。