日期:2011-04-27  浏览次数:20401 次

原文:《C# Version 3.0 Specification》,Microsoft
翻译:lover_P
C# 2.0中引入了匿名方法,允许在期望出现委托的时候以“内联(in-line)”的代码替代之。尽管匿名方法提供了函数式编程语言中的很多表达能力,但匿名方法的语法实在是太罗嗦了,并且很不自然。拉姆达表达式(Lambda expressions)为书写匿名方法提供了一种更加简单、更加函数化的语法。

拉姆达表达式的书写方式是一个参数列表后跟=>记号,然后跟一个表达式或一个语句块。

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规范中提到的匿名方法规范同样适用于拉姆达表达式。拉姆达表达式是匿名方法在功能行上的超集,提供了下列附加的功能:

l          拉姆达表达式允许省略参数类型并对其进行推断,而匿名方法要求参数类型必须显式地声明。

l          拉姆达表达式体可以是表达式或语句块,而匿名方法体只能是语句块。

l          在类型参数推导和方法重载抉择时,拉姆达表达式可以被作为参数传递。

l          以一个表达式作为表达式体的拉姆达表达式可以被转换为表达式树。

注意

PDC 2005技术预览版编译器并不支持以一个语句块作为表达式体的拉姆达表达式。当必需一个语句块时,请使用C# 2.0中的匿名方法语法。

3.1 拉姆达表达式转换

和匿名方法表达式类似,拉姆达表达式可以归类为一种拥有特定转换规则的值。这种值没有类型,但可以被隐式地转换为一个兼容的委托类型。特别地,当满足下列条件时,委托类型D兼容于拉姆达表达式L:

l          D和L具有相同数量的参数。

l