InvalidProgramException

InvalidProgramException

我遇到了一个有趣的问题,请参见以下代码。

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


这可以按预期工作(不执行任何操作,因为我们不执行任何操作),但是现在将“(Action)”替换为“ new Action”,然后看看会发生什么:

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'

最佳答案

如果为Main生成的IL准确,则看起来像C#编译器错误。 Main中IL_0001处的指令从评估堆栈中弹出不存在的内容。当Main正在JIT编译时,JIT编译器会注意到这一点并引发InvalidProgramException。

编辑:我猜这是您正在运行的编译器错误:http://connect.microsoft.com/VisualStudio/feedback/details/371711/invalidprogramexception-c-compiler-3-5

关于c# - 委托(delegate)转换的乐趣-> InvalidProgramException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5243065/

10-13 03:23