使用 Lambda 運算式和匿名函式時的錯誤和警告
有數個與宣告和使用 Lambda 運算式相關的錯誤:
- CS0748:Lambda 參數使用方式不一致;參數型別必須全部為明確或全部為隱含。
- CS1621:在匿名方法或 Lambda 運算式內不可使用 yield 陳述式。
- CS1628:在匿名方法、Lambda 運算式或查詢運算式內不可使用
in
ref
或out
參數。 - CS1632:控制項不可離開匿名方法或 Lambda 運算式的主體。
- CS1673:在結構內的匿名方法、Lambda 運算式和查詢運算式不可存取 'this' 的執行個體成員。
- CS1686:區域變數或其成員的位址無法取得,也不可在匿名方法或 Lambda 運算式內使用。
- CS1706:運算式不能含有匿名方法或 Lambda 運算式。
- CS8030:轉換成 void 傳回委派的匿名函式不可傳回值。
- CS8175:在匿名方法、Lambda 運算式或查詢運算式內不可使用參考區域。
- CS8916:Lambda 運算式上的屬性需要小括號內的參數清單。
- 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 運算式或查詢運算式內不可使用
in
、ref
或out
參數。 - CS1632:控制項不可離開匿名方法或 Lambda 運算式的主體。
- CS1673:結構內的匿名方法、Lambda 運算式和查詢運算式不可存取
this
的執行個體成員。 - CS1686:區域變數或其成員的位址無法取得,也不可在匿名方法或 Lambda 運算式內使用。
- CS8175:在匿名方法、Lambda 運算式或查詢運算式內不可使用參考區域。
Lambda 運算式中不允許下列所有建構:
yield
陳述式 (yield return
或yield break
)- 呼叫具有
in
、ref
或out
參數的方法 ref
區域變數break
、goto
和continue
陳述式- 當
this
為struct
型別時的this
存取 - 在另一個運算式內的匿名方法或 Lambda 運算式,例如屬性建構函式。
您不可在 Lambda 運算式或匿名方法中使用任何提及的建構。 許多都可在區域函式中使用。
此外,套用至 Lambda 參數時,會略過插補字串處理常式型別。 如果您使用任何一項,即會看到下列警告:
- CS8971:在套用至 Lambda 參數時 InterpolatedStringHandlerArgument 並沒有任何作用,而且會於呼叫網站遭略過。
Lambda 運算式參數和傳回
這些錯誤表示參數宣告有問題:
- CS0748:Lambda 參數使用方式不一致;參數型別必須全部為明確或全部為隱含。
- CS9098:隱含型別的 Lambda 參數 '...' 不可有預設值。
- CS8030:轉換成 void 傳回委派的匿名函式不可傳回值。
- CS8916:Lambda 運算式上的屬性需要小括號內的參數清單。
- CS8975: 不可將內容關鍵詞 'var' 做為明確的 Lambda 傳回型別使用。
Lambda 運算式參數必須遵循下列規則:
- 當 Lambda 運算式有多個參數時,則所有參數都必須是明確型別,或所有參數都必須是隱含型別。
- 具有預設值的所有 Lambda 參數都必須是明確型別。
- 如果屬性套用至任何參數,則參數清單必須置於括號中。
Lambda 運算式的傳回型別必須遵循下列規則:
- 傳回任何值的 Lambda 運算式不可轉換成傳回委派的
void
,例如Action
。 - 傳回型別為推斷,或是明確型別。 不允許使用關鍵字
var
宣告的傳回型別。
Lambda 運算式委派型別
- CS9099:警告:預設參數值在目標委派型別中不相符。
當您使用 Lambda 運算式參數宣告預設值或新增 params
修飾詞時,委派型別不是 Func
或 Action
型別的其中一種。 它其實是包含預設參數值或 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) => { };