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