CSC和Roslyn编译器的静态lambda表达式评估有何不同?

请考虑以下示例代码。

class Program { static void Main( string[] args ) { DoSomethingWithAction( i => { Console.WriteLine( "Value: {0}", i ); } ); Console.ReadLine(); } private static void DoSomethingWithAction( Action something ) { Console.WriteLine( something.Target == null ? "Method is static." : "Method is not static." ); something( 5 ); } } 

如果我使用Visual Studio 2010(在CSC编译器下)编译并在Debug下运行此代码,它将打印出以下结果:

 Method is not static. Value: 5 

如果我在Visual Studio 2010中编译相同的代码,但这次使用Release设置,将生成以下输出:

 Method is static. Value: 5 

现在,如果我们要使用Visual Studio 2015 CTP(在Roslyn编译器下)执行相同的代码,则会为DebugRelease设置生成以下输出:

 Method is not static. Value: 5 

首先,我发现VS2010(CSC)的调试版和发行版之间存在差异。 为什么不在调试下评估为静态方法? 此外,在某些情况下,它似乎在Debug中编译时评估为静态。 我有一个生产应用程序在Debug下获得预期的静态结果。

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

这是罗斯林团队的刻意改变。

指向实例方法的代理调用的速度稍快,因此Roslyn现在将lambdas编译为实例方法,即使它不需要。

见讨论 。