Lambda 表达式 (=>) 运算符定义 lambda 表达式

令牌 => 采用两种形式支持:作为 lambda 运算符 ,在 表达式正文定义中作为成员名称和成员实现的分隔符。

Lambda 运算符

lambda 表达式中,lambda 运算符 => 将左侧的输入参数与右侧的 lambda 正文分隔开来。

以下示例使用 LINQ 功能和方法语法来演示 lambda 表达式的用法:

string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
  .Where(w => w.StartsWith("a"))
  .Min(w => w.Length);
Console.WriteLine(minimalLength);   // output: 5

int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (interim, next) => interim * next);
Console.WriteLine(product);   // output: 280

lambda 表达式的输入参数在编译时强类型化。 当编译器可以推断输入参数的类型(如前面的示例中)时,可以省略类型声明。 如果需要指定输入参数的类型,则必须为每个参数执行此作,如以下示例所示:

int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (int interim, int next) => interim * next);
Console.WriteLine(product);   // output: 280

以下示例演示如何定义没有输入参数的 lambda 表达式:

Func<string> greet = () => "Hello, World!";
Console.WriteLine(greet());

有关详细信息,请参阅 Lambda 表达式

表达式正文定义

表达式主体定义具有下列常规语法:

member => expression;

其中 expression 是有效的表达式。 返回类型的返回类型 expression 必须隐式转换为成员的返回类型。 如果该成员:

  • void具有返回类型或
  • 是:
    • 构造函数
    • 终结器
    • 属性或索引器访问器set

expression 必须是 语句表达式。 由于放弃表达式的结果,因此该表达式的返回类型可以是任何类型的。

以下示例显示了方法的 Person.ToString 表达式正文定义:

public override string ToString() => $"{fname} {lname}".Trim();

它是以下方法定义的速记版本:

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}

可以为方法、运算符、只读属性、构造函数、终结器以及属性和索引器访问器创建表达式正文定义。 有关详细信息,请参阅 Expression-bodied 成员

运算符可重载性

=>无法重载运算符。

C# 语言规范

有关 lambda 运算符的详细信息,请参阅 C# 语言规范Anonymous 函数表达式部分。

另请参阅

  • C# 运算符和表达式