Если мы можем присвоить Лямбда-выражение типу делегата.Does Лямбда-выражение, преобразованное в делегата внутренне

Лямбда-выражение, преобразованное в делегата, вводят SqureDelegate ниже кода? Все лямбда-выражение или statments внутренне делегат.

public delegate int SqureDelegate(int a);

class Program
{
    static int Squre(int i)
    {            
        return i*i;
    }
    static void Main(string[] args)
    {
        SqureDelegate ss = x => { return x * x; };
    }
}
1
задан Cœur 11 February 2017 в 06:39
поделиться

1 ответ

Я скомпилировал код, затем декомпилировал с помощью ildasm, и вот что происходит:

SquareDelegate ss = x => {  return x * x; };

компилируется в

IL_0009:  ldftn      int32 MiscTestApp.Program::'<Main>b__0'(int32)
IL_000f:  newobj     instance void MiscTestApp.SquareDelegate::.ctor(object,
                                                                     native int)

и

.method private hidebysig static int32 
      '<Main>b__0'(int32 x) cil managed
{
  // square and return x
}

и

.class public auto ansi sealed MiscTestApp.SquareDelegate
   extends [mscorlib]System.MulticastDelegate
{
   // delegate implementation
}

В основном .Net компилирует SquareDelegate в класс который расширяет System.MulticastDelegate, то каждый раз, когда создается делегат, он создает экземпляр класса SquareDelegate (IL_0009 ...), используя временный метод b__0 . Компилятор генерирует частный статический метод b__0 для представления лямбда-выражения. Таким образом, каждая лямбда будет преобразована в соответствующий частный метод во время компиляции. Поскольку (насколько мне известно) вы никогда не можете использовать необработанное лямбда-выражение (оно всегда приводится к Action, Func или другому типу делегата), все лямбда-выражения являются внутренними делегатами.

2
ответ дан 2 September 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: