Lambda 表达式 (
令牌 => 采用两种形式支持:作为 lambda 运算符 ,在 表达式正文定义中作为成员名称和成员实现的分隔符。
C# 语言参考记录了 C# 语言的最新发布版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。
本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。
小窍门
若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。
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;
对于返回值的成员,表达式的结果必须隐式转换为成员的返回类型。
void对于成员、构造函数、终结器或set、initadd或remove访问器,正文必须是语句表达式。 语句表达式可以是赋值、方法调用、对象创建、递增或递减操作或 await 表达式。 其结果(如果有)将被丢弃。
以下示例显示了方法的 Person.ToString 表达式正文定义:
public override string ToString() => $"{fname} {lname}".Trim();
它是以下方法定义的速记版本:
public override string ToString()
{
return $"{fname} {lname}".Trim();
}
可以对以下成员使用表达式正文定义:
-
方法和本地函数: 返回值的成员具有窗体
T M() => expression;。 成员void具有窗体void M() => statementExpression;。 有关详细信息,请参阅方法和本地函数。 -
运算符: 运算符具有窗体
public static T operator +(T left, T right) => expression;。 有关详细信息,请参阅 运算符重载。 -
属性和索引器: 只读属性或索引器具有窗体
T P => expression;或T this[int i] => expression;。 还可以对单个访问器使用表达式主体。 访问get器具有形式get => expression;。 或setinit访问器具有窗体set => statementExpression;或init => statementExpression;. 有关详细信息,请参阅 属性 和 索引器。 -
构造函数和终结器: 这些成员具有窗体
C() => statementExpression;或~C() => statementExpression;。 有关详细信息,请参阅 构造函数 和 终结器。 -
事件访问器:或
addremove访问器具有窗体add => statementExpression;或remove => statementExpression;。 有关详细信息,请参阅 事件。
运算符可重载性
不能重载 => 运算符。
C# 语言规范
有关 lambda 运算符的详细信息,请参阅 C# 语言规范的 Anonymous 函数表达式部分。
另请参阅
- C# 运算符和表达式