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

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

  • CS0748Lambda 參數使用方式不一致;參數型別必須全部為明確或全部為隱含。
  • CS1621在匿名方法或 Lambda 運算式內不可使用 yield 陳述式。
  • CS1628在匿名方法、Lambda 運算式或查詢運算式內不可使用 inrefout 參數。
  • CS1632控制項不可離開匿名方法或 Lambda 運算式的主體。
  • CS1673在結構內的匿名方法、Lambda 運算式和查詢運算式不可存取 'this' 的執行個體成員。
  • CS1686區域變數或其成員的位址無法取得,也不可在匿名方法或 Lambda 運算式內使用。
  • CS1706運算式不能含有匿名方法或 Lambda 運算式。
  • CS8030轉換成 void 傳回委派的匿名函式不可傳回值。
  • CS8175在匿名方法、Lambda 運算式或查詢運算式內不可使用參考區域。
  • CS8916Lambda 運算式上的屬性需要小括號內的參數清單。
  • CS8971在套用至 Lambda 參數時 InterpolatedStringHandlerArgument 並沒有任何作用,而且會於呼叫網站遭略過。
  • CS8975不可將內容關鍵詞 var 做為明確的 Lambda 傳回型別使用。
  • CS9098隱含型別的 Lambda 參數 '...' 不可有預設值。

此外還有數個與宣告和使用 Lambda 運算式相關的警告

  • CS8971在套用至 Lambda 參數時 InterpolatedStringHandlerArgument 並沒有任何作用,而且會於呼叫網站遭略過。
  • CS9099預設參數值在目標委派型別中不相符。
  • CS9100參數在 Lambda 中具有 params 修飾詞,但在目標委派型別中則沒有。

Lambda 運算式中的語法限制

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

  • CS1621在匿名方法或 Lambda 運算式內不可使用 yield 陳述式。
  • CS1628在匿名方法、Lambda 運算式或查詢運算式內不可使用 inrefout 參數。
  • CS1632控制項不可離開匿名方法或 Lambda 運算式的主體。
  • CS1673結構內的匿名方法、Lambda 運算式和查詢運算式不可存取 this 的執行個體成員。
  • CS1686區域變數或其成員的位址無法取得,也不可在匿名方法或 Lambda 運算式內使用。
  • CS8175在匿名方法、Lambda 運算式或查詢運算式內不可使用參考區域。

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

  • yield 陳述式 (yield returnyield break)
  • 呼叫具有 inrefout 參數的方法
  • ref 區域變數
  • breakgotocontinue 陳述式
  • thisstruct 型別時的 this 存取
  • 在另一個運算式內的匿名方法或 Lambda 運算式,例如屬性建構函式。

您不可在 Lambda 運算式或匿名方法中使用任何提及的建構。 許多都可在區域函式中使用。

此外,套用至 Lambda 參數時,會略過插補字串處理常式型別。 如果您使用任何一項,即會看到下列警告:

  • CS8971在套用至 Lambda 參數時 InterpolatedStringHandlerArgument 並沒有任何作用,而且會於呼叫網站遭略過。

Lambda 運算式參數和傳回

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

  • CS0748Lambda 參數使用方式不一致;參數型別必須全部為明確或全部為隱含。
  • CS9098隱含型別的 Lambda 參數 '...' 不可有預設值。
  • CS8030轉換成 void 傳回委派的匿名函式不可傳回值。
  • CS8916Lambda 運算式上的屬性需要小括號內的參數清單。
  • CS8975不可將內容關鍵詞 'var' 做為明確的 Lambda 傳回型別使用。

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

  • 當 Lambda 運算式有多個參數時,則所有參數都必須是明確型別,或所有參數都必須是隱含型別。
  • 具有預設值的所有 Lambda 參數都必須是明確型別。
  • 如果屬性套用至任何參數,則參數清單必須置於括號中。

Lambda 運算式的傳回型別必須遵循下列規則:

  • 傳回任何值的 Lambda 運算式不可轉換成傳回委派的 void,例如 Action
  • 傳回型別為推斷,或是明確型別。 不允許使用關鍵字 var 宣告的傳回型別。

Lambda 運算式委派型別

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

當您使用 Lambda 運算式參數宣告預設值或新增 params 修飾詞時,委派型別不是 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) => { };