Основываясь на следующем вопросе , я обнаружил странное поведение компилятора c #.
Допустимо следующее C #:
static void K() {}
static void Main()
{
var k = new Action(new Action(new Action(K))));
}
Что я нахожустранно, что компилятор «деконструирует» переданный делегат.
Вывод ILSpy выглядит следующим образом:
new Action(new Action(new Action(null, ldftn(K)), ldftn(Invoke)).Invoke);
Как видно, он автоматически решает использовать метод Invoke
делегировать.Но почему?
Как таковой, код неясен.Есть ли у нас трижды завернутый делегат (фактический) или внутренний делегат просто «скопирован» во внешние (моя первоначальная мысль).
Конечно, если намерение было похоже на то, как компилятор выдал код, нужнонаписал:
var k = new Action(new Action(new Action(K).Invoke).Invoke);
Похоже на декомпилированный код.
Кто-нибудь может объяснить причину этого «удивительного» преобразования?
Обновление:
Я могу думать только об одном возможном случае использования для этого;преобразование типа делегата.Например:
delegate void Baz();
delegate void Bar();
...
var k = new Baz(new Bar( new Action (K)));
Возможно, компилятор должен выдать предупреждение, если используются те же типы делегатов.