2017-02-22 44 views
9

Я бегу следующую программу на двух разных машинах:Анонимный метод в статическом классе нестационарен? Как его вызывать?

static class Program 
{ 
    static void Main(string[] args) 
    { 
     Func<int> lambda =() => 5; 
     Console.WriteLine(lambda.GetMethodInfo().IsStatic); 
     Console.ReadLine(); 
    }   
} 

На одной машине, с .NET 4.5 и Visual Studio 2012 установлена ​​эта печать «истинный», на другой, с .NET Framework 4.6.2 и Visual Studio 2015 он печатает «false».

Я думал, что анонимные методы были статическими, если они определены в статическом контексте. Это изменилось (документированным образом) во время некоторых последних обновлений фреймов?

Что мне нужно сделать, это использовать Expression.Call по адресу lambda.GetMethodInfo(), а в нестатическом случае для этого требуется экземпляр, на котором определена лямбда. Если бы я хотел использовать lambda.GetMethodInfo().Invoke, я столкнулся бы с той же проблемой.

Как я могу получить такой экземпляр?

+0

Но какова ваша цель? Каков ожидаемый результат? –

ответ

9

Имейте в виду, что это (lambdas) является компилятором, поэтому версия среды исполнения не изменит ситуацию. Кроме того, , потому что это функция компилятора, не удивительно, что существует разница между 2012 и 2015 годами (когда был представлен Roslyn, который заменил большую часть существующей инфраструктуры компилятора).

Я не могу дать твердую причину, по которой он был бы конкретно здесь изменились (хотя я знаю, что некоторые изменения были внесены включен Edit-и-продолжать работать в более контекстах), но он никогда не был договорной о как lambdas реализованы.

Как я могу получить такой экземпляр?

Ну, lambda является Delegate, и что всегда подвергается Target свойство, которое ссылается на экземпляр, когда делегат так переплетены.

+0

Вот и все, спасибо. Основываясь на вашем ответе, я нашел некоторую документацию в github Roslyn. Кажется, это улучшение производительности: https://roslyn.codeplex.com/workitem/246 – Jens

0

Как я могу получить такой экземпляр

Я не уверен, что это имеет значение? Конечно, вы можете запустить функцию лямбда просто делать это (например)

Console.Print(lambda());

Поэтому тот факт, что он является статическим или не в значительной степени несущественным.

+0

Мне нужно использовать 'Expression.Call', я просто не могу просто назвать его. – Jens

+0

@Jens достаточно справедливо – SpaceUser7448

 Смежные вопросы

  • Нет связанных вопросов^_^