Lambdas不依赖于任何新的框架功能.在一天结束时,lambda只需要能够创建一个包含字段,方法和构造函数的新类,所有这些类都可以在1.0运行时/框架中使用.
以下代码:
int value = 42;
MyDelegate f = () => value;
Run Code Online (Sandbox Code Playgroud)
将被转换为新的命名类型:
public class SomeRandomCompilerGeneratedNameGoesHere
{
public int value;
public int SomeGeneratedMethodName()
{
//the content of the anonymous method goes here
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
并将使用如下:
var closureClass = new SomeRandomCompilerGeneratedNameGoesHere();
closureClass.value = 42;
MyDelegate f = closureClass.SomeGeneratedMethodName;
Run Code Online (Sandbox Code Playgroud)
现在,有一些情况并不需要所有这些; 如果没有关闭的值,这些步骤中的一些可以兴高采烈,并且添加了优化(即该方法可以是静态的,以避免创建对象实例),但此处显示的转换能够映射任何有效的C#lambda ,正如您所看到的,即使在C#1.0中,它转换为的代码也是有效的.
Lambda表达式是编译器功能.您不需要框架或CLR支持.
编译器将为您创建一个方法,并为您执行隐式委托转换和所有这些内容.您只需要实现该功能的新编译器.
大多数语言功能都与任何版本的.Net框架无关.其中一些只是工作; 其中一些可以使用一些技巧进行调整.
例如:隐式委托转换,Collection Initializer,Object Initializer将按原样工作.扩展方法可以与一些技巧一起使用.
有关详细信息,请参阅Jon的文章 "在.NET 2.0和3.0中使用C#3"部分.
FWIW,仅使用相同的概念BCL.Async库启用与.net 4.5一起发布的.Net 4.0中的async-await功能.