В соответствии с этим ответом, когда код использует локальные переменные из внутренних лямбда-методов, компилятор будет генерировать дополнительные классы, которые могут иметь имя, например c__DisplayClass1
. Например, следующий (совершенно бесполезный) код:
class Program
{
static void Main()
{
try {
implMain();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
static void implMain()
{
for (int i = 0; i < 10; i++) {
invoke(() => {
Console.WriteLine(i);
throw new InvalidOperationException();
});
}
}
static void invoke(Action what)
{
what();
}
}
выводит следующий стек вызовов:
System.InvalidOperationException
at ConsoleApplication1.Program.<>c__DisplayClass2.<implMain>b__0()
at ConsoleApplication1.Program.invoke(Action what)
at ConsoleApplication1.Program.implMain()
at ConsoleApplication1.Program.Main()
Обратите внимание, что там есть c__DisplayClass2
, который является именем класса, сгенерированного компилятором, для хранения переменной цикла.
Согласно этот ответ c__DisplayClass
"означает"
c → класс закрытия анонимного метода ( "DisplayClass" )
Хорошо, но что здесь означает "DisplayClass"?
Что делает этот сгенерированный класс "отображением"? Другими словами, почему это не "MagicClass" или "GeneratedClass" или любое другое имя?