使用 lambda 表达式和匿名函数时的错误和警告

有几个与声明和使用 lambda 表达式相关的错误:

  • CS0748:Lambda 参数的用法不一致;参数类型必须全部为显式或全部为隐式。
  • CS1621:不能在匿名方法或 Lambda 表达式内使用 yield 语句。
  • CS1628:不能在匿名方法、Lambda 表达式或查询表达式中使用 inrefout 参数。
  • 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 表达式或查询表达式中使用 inrefout 参数。
  • CS1632:控制不得离开匿名方法或 Lambda 表达式主体。
  • CS1673:结构内部的匿名方法、Lambda 表达式和查询表达式无法访问 this 的实例成员。
  • CS1686:不能采用局部变量或其成员的地址,也不能在匿名方法或 Lambda 表达式内部使用它们。
  • CS8175:不能在匿名方法、Lambda 表达式或查询表达式内使用 ref 局部变量。

Lambda 表达式中不允许以下所有构造:

  • yield 语句(yield returnyield break
  • 调用具有 inrefout 参数的方法
  • ref 局部变量
  • breakgotocontinue 语句
  • thisstruct 类型时的 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 修饰符时,委托类型不是 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) => { };