C# CSC和Roslyn编译器的差异';静态lambda表达式求值?

C# CSC和Roslyn编译器的差异';静态lambda表达式求值?,c#,roslyn,csc,C#,Roslyn,Csc,考虑下面的示例代码 class Program { static void Main( string[] args ) { DoSomethingWithAction( i => { Console.WriteLine( "Value: {0}", i ); } ); Console.ReadLine(); } private static v

考虑下面的示例代码

class Program
{
    static void Main( string[] args )
    {
        DoSomethingWithAction( i =>
            {
                Console.WriteLine( "Value: {0}", i );
            } );

        Console.ReadLine();
    }

    private static void DoSomethingWithAction( Action<int> something )
    {
        Console.WriteLine( something.Target == null
            ? "Method is static."
            : "Method is not static." );

        something( 5 );
    }
}
如果我在Visual Studio 2010中编译相同的代码,但这次使用了发布设置,将生成以下输出:

Method is static.
Value: 5
现在,如果我们要执行相同的代码,但这次使用Visual Studio 2015 CTP(在Roslyn编译器下),则会为调试设置和发布设置生成以下输出:

Method is not static.
Value: 5
首先,我觉得奇怪的是,VS2010(CSC)的调试版本和发布版本之间存在差异为什么不在调试中作为静态方法进行计算?此外,在某些情况下,在调试中编译时,它确实作为静态方法进行计算。我有一个生产应用程序,它正在调试中获得预期的静态结果


其次,Roslyn编译器是否应该匹配CSC在这种特定情况下的行为?

这是Roslyn团队故意做出的更改

指向实例方法的委托调用速度稍快,因此Roslyn现在将lambdas编译为实例方法,即使它不需要这样做


请参阅。

IL没有lambdas的概念。lambda被编译为匿名类型。如链接问题所示,如果不涉及闭包,编译器可能会生成静态方法。但是,您的代码不应该依赖于这种行为,这完全是编译器实现和测试的问题optimizations@PanagiotisKanavos是的,我理解为什么,也同意你的观点,代码不应该依赖于这种行为,这只是我发现的东西,我对这种差异很好奇。我不同意这项质询与有关质询重复。我的问题是,如果不存在闭包,它可能会使方法成为静态的。我的问题基本上是问为什么Roslyn编译器会选择根本不这样做。看,这解释了为什么会做出这样的更改。
Method is not static.
Value: 5