使用 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 表达式或查询表达式内使用 ref 局部变量。
- CS8916:Lambda 表达式上的属性需要拥有带圆括号的参数列表。
- CS8971:InterpolatedStringHandlerArgument 在应用于 Lambda 参数时不起任何作用,并将在调用站点被忽略。
- CS8975:上下文关键字
var
不能用作显式 Lambda 返回类型。 - CS9098:隐式键入的 Lambda 参数“…”不能具有默认值。
此外,还有几个与声明和使用 Lambda 表达式相关的警告:
- CS8971:InterpolatedStringHandlerArgument 在应用于 Lambda 参数时不起任何作用,并将在调用站点被忽略。
- CS9099:默认参数值在目标委托类型中不匹配。
- CS9100:参数在 Lambda 中具有参数修饰符,但在目标委托类型中没有。
Lambda 表达式中的语法限制
Lambda 表达式和匿名方法中禁止某些 C# 语法。 在 Lambda 表达式中使用无效构造会导致以下错误:
- CS1621:不能在匿名方法或 Lambda 表达式内使用
yield
语句。 - CS1628:不能在匿名方法、Lambda 表达式或查询表达式中使用
in
、ref
或out
参数。 - CS1632:控制不得离开匿名方法或 Lambda 表达式主体。
- CS1673:结构内部的匿名方法、Lambda 表达式和查询表达式无法访问
this
的实例成员。 - CS1686:不能采用局部变量或其成员的地址,也不能在匿名方法或 Lambda 表达式内部使用它们。
- CS8175:不能在匿名方法、Lambda 表达式或查询表达式内使用 ref 局部变量。
Lambda 表达式中不允许以下所有构造:
yield
语句(yield return
或yield break
)- 调用具有
in
、ref
或out
参数的方法 ref
局部变量break
、goto
和continue
语句this
是struct
类型时的this
访问- 另一个表达式中的匿名方法或 Lambda 表达式,例如 Attribute 构造函数。
不能在 Lambda 表达式或匿名方法中使用上述任何构造。 本地函数中允许使用多个构造。
此外,当应用于 lambda 参数时,将忽略内插字符串处理程序类型。 如果使用,会看到以下警告:
- CS8971:InterpolatedStringHandlerArgument 在应用于 Lambda 参数时不起任何作用,并将在调用站点被忽略。
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) => { };