Странность компилятора C# с конструкторами делегатовC#

Место общения программистов C#
Ответить
Anonymous
 Странность компилятора C# с конструкторами делегатов

Сообщение Anonymous »

Основываясь на следующем вопросе, я обнаружил странное поведение компилятора 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);
Аналогично декомпилированному коду.

Может ли кто-нибудь объяснить причину этого «неожиданного» преобразования?

Аналогично декомпилированному коду.

Может ли кто-нибудь объяснить причину этого «неожиданного» преобразования?

Аналогично декомпилированному коду.

Кто-нибудь может объяснить причину этого «неожиданного» преобразования?

Аналогично декомпилированному коду.

Может ли кто-нибудь объяснить причину этого «удивительного» преобразования?

Аналогично декомпилированному коду.

Может ли кто-нибудь объяснить причину этого «удивительного» преобразования?

Аналогично декомпилированному коду.

Кто-нибудь может объяснить причину этого «удивительного» преобразования? p>

Обновление:

Я могу придумать только один возможный вариант использования этого; преобразование типов делегатов. Например:

Код: Выделить всё

delegate void Baz();
delegate void Bar();
...
var k = new Baz(new Bar( new Action (K)));
Возможно, компилятор должен выдать предупреждение, если используются одни и те же типы делегатов.

Подробнее здесь: https://stackoverflow.com/questions/807 ... nstructors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»