Необработанная декомпиляция (Reflector без оптимизаций) двоичного файла режима отладки:
private class Derived : Program.Base
{
// Methods
public Derived()
{
base..ctor(new Func<string>(Program.Derived.<.ctor>b__0));
return;
}
[CompilerGenerated]
private static string <.ctor>b__0()
{
string CS$1$0000;
CS$1$0000 = CS$1$0000.CheckNull();
Label_0009:
return CS$1$0000;
}
private string CheckNull()
{
string CS$1$0000;
CS$1$0000 = "Am I null? " + ((bool) (this == null));
Label_0017:
return CS$1$0000;
}
}
Метод CompilerGenerated не имеет смысла; если вы посмотрите на IL (ниже), он вызывает метод с нулевой строкой (!).
.locals init (
[0] string CS$1$0000)
L_0000: ldloc.0
L_0001: call instance string CompilerBug.Program/Derived::CheckNull()
L_0006: stloc.0
L_0007: br.s L_0009
L_0009: ldloc.0
L_000a: ret
В режиме Release локальная переменная оптимизируется, поэтому она пытается поместить несуществующую переменную в стек.
L_0000: ldloc.0
L_0001: call instance string CompilerBug.Program/Derived::CheckNull()
L_0006: ret
(Отражатель падает при превращении его в C #)
РЕДАКТИРОВАТЬ : Кто-нибудь (Эрик Липперт?) Знает, почему компилятор выдает ldloc
?