CSC和Roslyn编译器静态lambda表达式求值的差异
本文关键字:表达式 lambda Roslyn 编译器 静态 CSC | 更新日期: 2023-09-27 18:02:32
考虑以下示例代码:
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(在CSC编译器下)在Debug下编译并运行此代码,它将打印出以下结果:
Method is not static.
Value: 5
如果我在Visual Studio 2010中编译相同的代码,但这次使用Release设置,将生成以下输出:
Method is static.
Value: 5
现在,如果我们要执行相同的代码,但这次使用Visual Studio 2015 CTP(在Roslyn编译器下),将为Debug和Release设置生成以下输出:
Method is not static.
Value: 5
首先,我发现很奇怪的是VS2010 (CSC)的调试和发布版本之间存在差异。为什么它在调试时不作为静态方法进行评估?此外,在某些情况下,它在调试中编译时确实作为静态计算。我有一个生产应用程序,在Debug下得到预期的静态结果。
其次, Roslyn编译器是否应该匹配CSC在这种特殊情况下的行为?
这是Roslyn团队故意做出的改动。
指向实例方法的委托调用起来稍微快一些,所以Roslyn现在将lambdas编译为实例方法,即使它不需要。
看到讨论。