如何在.NET框架中解析lambdas?

Jos*_*lds 7 .net c# vb.net lambda

例如,您可以在Visual Studio 2010中使用lambda表达式,但仍然以.NET 2.0为目标.

编译器如何解析lambda表达式以使用不包含此功能的旧框架?

Ser*_*rvy 9

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中,它转换为的代码也是有效的.


Sri*_*vel 5

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功能.