Веселье с приведением делегата -> InvalidProgramException - PullRequest
2 голосов
/ 09 марта 2011

Я столкнулся с интересной проблемой, см. Следующий код.

class Program
{
    static void Main(string[] args)
    {        
        var testDelegate = (System.Delegate)(Action)(() =>
        {
            Console.WriteLine("Hey!");
        });
    }
}

Это работает как ожидалось (ничего не делает, так как мы ничего не вызываем), но теперь заменим "(Действие)"с" новым действием "и посмотрите, что произойдет:

class Program
{
    static void Main(string[] args)
    {
        var testDelegate = (System.Delegate)new Action(() =>
        {
            Console.WriteLine("Hey!");
        });
    }
}

Он прекрасно компилируется, но когда я пытаюсь его запустить, я получаю" InvalidProgramException ".Любые мысли о том, почему это происходит?

РЕДАКТИРОВАТЬ

Это сборка DEBUG, выпуск выпуска не показывал ту же проблему.

ILдля основного:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       3 (0x3)
  .maxstack  0
  .locals init ([0] class [mscorlib]System.Delegate testDelegate)
  IL_0000:  nop
  IL_0001:  stloc.0
  IL_0002:  ret
} // end of method Program::Main

IL для делегата:

.method private hidebysig static void  '<Main>b__0'() cil managed
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hey!"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::'<Main>b__0'

1 Ответ

1 голос
/ 09 марта 2011

Похоже, ошибка компилятора C #, если этот сгенерированный IL для Main является точным.Инструкция на IL_0001 в Main выводит что-то из стека оценки, которого там нет.JIT-компилятор замечает это и вызывает InvalidProgramException, когда Main компилируется в JIT.

Редактировать: я думаю, что это ошибка компилятора, с которой вы столкнулись:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...