共用方式為


使用 lambda 運算式和匿名函式時的錯誤和警告

有數個與宣告和使用 lambda 運算式相關的 錯誤

  • CS0748Lambda 參數使用方式不一致;參數類型必須全部是明確或全部隱含。
  • CS1621yield 陳述式無法在匿名方法或 lambda 運算式內使用。
  • CS1628無法在匿名方法、Lambda 運算式或查詢運算式內使用 inrefout 參數。
  • CS1632控制項無法離開匿名方法或 Lambda 運算式的主體。
  • CS1673結構內的匿名方法、Lambda 運算式和查詢運算式無法存取 'this' 的實例成員。
  • CS1686區域變數或其成員無法取得其位址,並在匿名方法或 Lambda 運算式內使用。
  • CS1706運算式不能包含匿名方法或 Lambda 運算式。
  • CS8030轉換成 void 傳回委派的匿名函式無法傳回值。
  • CS8175無法在匿名方法、Lambda 運算式或查詢運算式內使用 ref local 。
  • CS8916Lambda 運算式的屬性需要括弧內的參數清單。
  • CS8971InterpolatedStringHandlerArgument 套用至 Lambda 參數時沒有任何作用,而且會在呼叫網站上忽略。
  • CS8975內容關鍵字 var 無法作為明確的 Lambda 傳回類型使用。
  • CS9098隱含型別 lambda 參數「...」不能設定預設值。

此外,還有幾個與宣告和使用 lambda 表達式相關的 警告

  • CS8971InterpolatedStringHandlerArgument 套用至 Lambda 參數時沒有任何作用,而且會在呼叫網站上忽略。
  • CS9099預設參數值在目標委派類型中不相符。
  • CS9100在 lambda 表達式中,參數有 params 修飾詞,但在目標委派類型中卻沒有。

編譯器也會產生下列 參考訊息

  • CS9236編譯需要系結 lambda 運算式至少計數次數。請考慮使用明確的參數類型來宣告 lambda 運算式,或者如果包含的方法呼叫是泛型,請考慮使用明確的類型引數。

lambda 運算式的語法限制

某些 C# 語法禁止在 lambda 運算式和匿名方法中使用。 在 lambda 運算式中使用無效的建構會導致下列錯誤:

  • CS1621yield 陳述式無法在匿名方法或 Lambda 運算式內使用。
  • CS1628無法在匿名方法、Lambda 運算式或查詢運算式內使用 inrefout 參數。
  • CS1632控制項無法離開匿名方法或 Lambda 運算式的主體。
  • CS1673結構內的匿名方法、Lambda 運算式和查詢運算式無法存取 的實例成員 this
  • CS1686區域變數或其成員無法取得其位址,並在匿名方法或 Lambda 運算式內使用。
  • CS8175無法在匿名方法、Lambda 運算式或查詢運算式內使用 ref local 。

lambda 運算式中不允許下列所有建構:

  • yield 陳述式 (yield returnyield break
  • 呼叫具有 inrefout 參數的方法
  • ref 局部變數
  • breakgotocontinue 陳述式
  • this access when this 是類型 struct
  • 匿名方法或 lambda 表達式位於另一個表達式內,例如 Attribute 建構函式。

您無法在 lambda 運算式或匿名方法中使用任何這些建構。 大多數在本地函式中是被允許的。

此外,插值字串處理常式類型在套用至 lambda 參數時會被忽略。 如果您使用其中一個,您會看到以下警告:

  • CS8971InterpolatedStringHandlerArgument 套用至 Lambda 參數時沒有任何作用,而且會在呼叫網站上忽略。

某些運算式會導致編譯器發出下列資訊警告:

  • CS9236編譯需要系結 lambda 運算式至少計數次數。請考慮使用明確的參數類型來宣告 lambda 運算式,或者如果包含的方法呼叫是泛型,請考慮使用明確的類型引數。

lambda 運算式的複雜性及其叫用其他 lambda 運算式的方式會對編譯器效能產生負面影響。 原因是編譯器必須透過 lambda 表達式來推斷參數和參數類型,而潛在的類型需要時間。

Lambda 表示式參數和返回値

這些錯誤表示參數宣告有問題:

  • CS0748Lambda 參數使用方式不一致;參數類型必須全部是明確或全部隱含。
  • CS9098隱含型別的 lambda 參數 '...'不能有預設值。
  • CS8030轉換成 void 傳回委派的匿名函式無法傳回值。
  • CS8916Lambda 運算式的屬性需要括弧內的參數清單。
  • CS8975上下文關鍵字 'var' 不能用作明確的 lambda 傳回類型。

Lambda 運算式參數必須遵循下列規則:

  • 當 lambda 運算式有多個參數時,所有參數都必須明確輸入,或所有參數都必須隱含輸入。
  • 所有具有預設值的 lambda 參數都必須明確輸入。
  • 如果屬性套用至任何參數,則參數清單必須括在括弧中。

lambda 表達式的回傳類型必須遵循以下規則:

  • 傳回任何值的 lambda 運算式無法轉換為 void 傳回的委派,例如 Action
  • 傳回類型是推導的,或明確的類型。 不允許使用關鍵字 var 宣告的傳回類型。

Lambda 表示式委派類型

  • CS9099:警告: 預設參數值在目標委派類型中不相符。

當您宣告預設值或將 params 修飾詞新增至 lambda 運算式參數時,委派類型不是其中一個 FuncAction 類型。 相反地,它是包含預設參數值或 params 修飾符的自訂類型。 下列程式碼會產生警告,因為它會將具有預設參數的 lambda 運算式指派給 Action 類型:

Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };

若要修正錯誤,請移除預設參數,或針對委派類型使用隱含類型的變數:

Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };