Compiler generierte falschen Code für anonyme Methoden [MS BUG FIXED]
Siehe folgenden Code:
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();
wirft eine Ausnahme. Innerhalb der generierten CIL der MethodeBang
Ich habe:
call instance void ConsoleApp.Derived::'<>n__FabricatedMethod1'<string>()
und die Signatur der vom Compiler generierten Methode:
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
}
Ich denke der richtige Code sollte sein'<>n__FabricatedMethod1'<class T>
. Ist es ein Bug? Übrigens, ohne zu benutzendelegate{ }
(Lambda-Ausdruck ist derselbe), der Code funktioniert gut mit Syntaxzuckern.
Action good = new Action(base.Foo<string>());
good(); //fine
BEARBEITEN Ich verwende VS2012 RTMRel in Windows 8 RTM, .NET Framework 4.5
BEARBEITEN Dieser Fehler ist jetzt behoben.