【发布时间】:2011-03-09 08:24:27
【问题描述】:
我遇到了一个有趣的问题,请看下面的代码。
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'
【问题讨论】:
-
无法重现,没想到。你确定样品是正确的吗?如果是这样,您能否提供更多信息(框架版本等)?
-
上面的代码工作得很好......
-
@Ani 在 Visual Studio 2008 sp1,Target Framework 3.5 中完成。我已经能够在两台不同的机器上重现这一点,一台 Win XP 和一台 Win7。 (不过 vs2008 的安装是一样的)...
-
您能否使用 ildasm 包含为 Main 生成的 IL?我认为这个示例代码没有任何问题。
-
@Peter Huene:我已经发布了 IL。