30

请参阅以下代码:

public abstract class Base
{
    public virtual void Foo<T>() where T : class
    {
        Console.WriteLine("base");
    }
}

public class Derived : Base
{
    public override void Foo<T>()
    {
        Console.WriteLine("derived");
    }

    public void Bang()
    {
        Action bang = new Action(delegate { base.Foo<string>(); });
        bang();    //VerificationException is thrown
    }
}

new Derived().Bang();抛出异常。在Bang我得到的方法生成的 CIL 中:

call instance void ConsoleApp.Derived::'<>n__FabricatedMethod1'<string>()

以及编译器生成方法的签名:

method private hidebysig 
    instance void '<>n__FabricatedMethod1'<T> () cil managed 
{
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
        01 00 00 00
    )       
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: call instance void ConsoleApp.Base::Foo<!!T>()
    IL_0006: ret
}

我认为正确的代码应该是'<>n__FabricatedMethod1'<class T>. 它是一个错误吗?顺便说一句,不使用delegate{ }(lambda 表达式是相同的),代码可以很好地使用语法糖。

Action good = new Action(base.Foo<string>());
good();  //fine

编辑我在 windows8 RTM、.net 框架 4.5 中使用 VS2012 RTMRel

编辑此错误现已修复。

4

2 回答 2

3

已确认为错误,现已修复

更新:Connect 文章不再存在。该错误已修复。

于 2012-12-14T07:52:00.863 回答
1

起初 - 这是解决此问题的一种可能方法,但可能不是您问题的答案。(但评论没有代码格式)

我相信这类似于:Outer Variable Trap,因为您使用 Foo() 方法作为变量,并且 .NET 中存在错误(或者可能是功能)

我试图将 Bang() 方法更改为此

public void Bang()
{
    Action baseMethod = base.Foo<string>;
    Action bang = new Action(delegate { baseMethod(); });
    bang();    //VerificationException is thrown
}

它有效,结果是“基础”

我希望它有一点帮助。

于 2012-10-17T10:04:16.457 回答