Разница в оценке статического лямбда-выражения CSC и компилятора Roslyn?
Рассмотрим следующий пример кода.
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 );
}
}
Если я скомпилирую и выполню этот код в Debug с использованием Visual Studio 2010 (в компиляторе CSC), он выведет следующий результат:
Method is not static.
Value: 5
Если я скомпилирую тот же код в Visual Studio 2010, но на этот раз с использованием параметров выпуска, будет сгенерирован следующий вывод:
Method is static.
Value: 5
Теперь, если бы нам нужно было выполнить тот же код, но на этот раз с использованием CTP-версии Visual Studio 2015 (в рамках компилятора Roslyn), для параметров Debug и Release генерируется следующий вывод:
Method is not static.
Value: 5
Во-первых, мне кажется любопытным, что существует разница между версиями VS2010 (CSC) для отладки и выпуска. Почему бы не оценивать как статический метод при отладке? Кроме того, похоже, что в некоторых случаях он оценивается как статический при компиляции в Debug. У меня есть производственное приложение, которое получает ожидаемый статический результат при отладке.
Во-вторых, должен ли компилятор Roslyn соответствовать поведению CSC в данном конкретном случае?
1 ответ
Это было преднамеренное изменение, сделанное командой Roslyn.
Делегаты, указывающие на методы экземпляра, запускаются немного быстрее, поэтому Roslyn теперь компилирует лямбды в методы экземпляра, даже когда в этом нет необходимости.
Смотрите обсуждение.