本文涵蓋下列編譯器錯誤和警告:
- 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 。
相關診斷
- 欲了解更多關於表達式樹中局部函式的資訊,請參閱 C# 編譯器訊息中 某些表達式被禁止出現 。
- 如需更多有關具有泛型類型參數之區域函式的資訊,請參閱 C# 編譯器訊息中的 解析與泛型類型參數和類型引數相關的錯誤及警告。
- 如需更多有關區域函式上屬性的資訊,請參閱 C# 編譯器訊息中的「解決程式碼中涉及屬性宣告和屬性使用的錯誤與警告」。
- 欲了解更多關於匿名函式中擷取變數的資訊,請參閱 C# 編譯器訊息中的 Lambda 表達式錯誤與警告 。
- 如需更多有關在建構函式和主建構函式中的擷取資訊,請參閱 C# 編譯器訊息中的 解決與建構函式宣告和模組初始設定式相關的錯誤。