expression:
assignment
non-assignment-expression
non-assignment-expression:
conditional-expression
lambda-expression
query-expression
lambda-expression:
( lambda-parameter-listopt ) => lambda-expression-body
implicitly-typed-lambda-parameter => lambda-expression-body
lambda-parameter-list:
explicitly-typed-lambda-parameter-list
implicitly-typed-lambda-parameter-list
explicitly-typed-lambda-parameter-list:
explicitly-typed-lambda-parameter
explicitly-typed-lambda-parameter-list , explicitly-typed-lambda-parameter
explicitly-typed-lambda-parameter:
parameter-modifieropt type identifier
implicitly-typed-lambda-parameter-list:
implicitly-typed-lambda-parameter
implicitly-typed-lambda-parameter-list , implicitly-typed-lambda-parameter
implicitly-typed-lambda-parameter:
identifier
lambda-expression-body:
expression
block
拉姆达表达式的参数可以具有显式的或隐式的类型。在一个具有显式类型的参数列表中,每个参数的类型都是显式声明的。在
一个具有隐式类型的参数列表中,参数的类型是从拉姆达表达式出现的上下文中推断出来的——具体来说,是当拉姆达表达式
被转换为一个兼容的委托类型时,该委托类型提供了参数的类型。
当拉姆达表达式只有一个具有隐式类型的参数时,参数列表中的括号可以省略。换句话说,下面这种形式的拉姆达表达式:
( param ) => expr
可以简写为:
param => expr
下面给出的是拉姆达表达式的一些例子:
x => x + 1 // 隐式类型,以表达式作为拉姆达表达式体
x => { return x + 1; } // 显式类型,以语句块作为拉姆达表达式体
(int x) => x + 1 // 显式类型,以表达式作为拉姆达表达式体
(int x) => { return x + 1; } // 显式类型,以语句块作为拉姆达表达式体
(x, y) => x * y // 多个参数
() => Console.WriteLine() // 没有参数
通常,C# 2.0规范中提到的匿名方法规范同样适用于拉姆达表达式。拉姆达表达式是匿名方法在功能行上的超集,提供了下列
附加的功能:
拉姆达表达式允许省略参数类型并对其进行推断,而匿名方法要求参数类型必须显式地声明。
拉姆达表达式体可以是表达式或语句块,而匿名方法体只能是语句块。
在类型参数推导和方法重载抉择时,拉姆达表达式可以被作为参数传递。
以一个表达式作为表达式体的拉姆达表达式可以被转换为表达式树。