C# 代表角色扮演的乐趣->;无效程序异常

C# 代表角色扮演的乐趣->;无效程序异常,c#,visual-studio-2008-sp1,C#,Visual Studio 2008 Sp1,我遇到了一个有趣的问题,请参阅下面的代码 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)(Action)(() =>
        {
            Console.WriteLine("Hey!");
        });
    }
}
这正如预期的那样工作(不做任何事情,因为我们不调用任何东西),但是现在将“(操作)”替换为“新操作”,看看会发生什么:

class Program
{
    static void Main(string[] args)
    {
        var testDelegate = (System.Delegate)new Action(() =>
        {
            Console.WriteLine("Hey!");
        });
    }
}
它编译得很好,但当我尝试运行它时,会得到一个“invalidProgrammeException”。你有没有想过为什么会这样

编辑

这是调试版本,发布版本没有显示相同的问题

主要设备的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'
.method private hidebysing static void'b_u0'()cil托管
{
.custom instance void[mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()=(01 00)
//代码大小13(0xd)
.maxstack 8
IL_0000:没有
IL_0001:ldstr“嘿
IL_0006:调用void[mscorlib]System.Console::WriteLine(字符串)
没有
IL_000c:ret
}//方法结束程序::'b__0'
如果为Main生成的IL是准确的,则看起来像是C#编译器错误。Main中IL_0001处的指令从计算堆栈中弹出不存在的内容。JIT编译器注意到这一点,并在JIT编译Main时引发InvalidProgrameException


编辑:我猜这就是您遇到的编译器错误:

无法复制,并且没有预料到。你确定样品是正确的吗?如果是这样的话,你能提供更多信息(框架版本等)吗?上面的代码工作得很好…@Ani在VisualStudio2008SP1,TargetFramework3.5中完成了这项工作。我已经能够在两台不同的机器上重现这一点,一台是WinXP,另一台是Win7。(尽管vs2008安装是相同的)…您可以使用ildasm为Main包含生成的IL吗?我认为这个示例代码没有什么问题。@Peter Huene:我已经发布了IL。更不用说maxstack是0了。不幸的是,我没有VS 2008 SP1来看看我是否可以复制它。@M$:EPIC在
上失败,我们无法为下一版本的Visual Studio获得此修复程序
@Mehrdad:由于我的笔记本电脑在虚拟机上只有Windows,而虚拟机中没有安装VS,我无法确认它是否在2010年得到解决。通常,一个被接受的连接错误会产生足够多的唠叨电子邮件,让指定的开发人员在问题得到解决的情况下正确地关闭它。作为一名前微软开发人员,我必须说,由于发布周期长而繁琐,无法快速解决客户问题,这让我发疯。@Peter Huene:啊,一定是这样。谢谢你找到它!我从没想过我会在我的生活中偶然发现一个C#的编译器错误:o。无论如何,下面是使用3.5编译器编译它的命令行:“C:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe/reference:“C:\Program Files\reference Assembly\Microsoft\Framework\v3.5\System.Core.dll”/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll/out:invalidProg2.exe/target:exe Program.cs”@Peter:Huh,有趣的。。。是的,我想这也会让我发疯。这听起来并不有趣,听到人们抱怨某件事,但却不能及时解决。。。尤其是当人们没有意识到这不是你的错时\