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