Siehe den folgenden Code:Compiler generiert falschen Code für anonyme Methoden [MS BUG FIXED]
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();
eine Ausnahme auslöst. Im Inneren des erzeugten CIL des Verfahrens Bang
Ich habe:
call instance void ConsoleApp.Derived::'<>n__FabricatedMethod1'<string>()
und die Unterschrift des Compiler erzeugt 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
}
denke ich, der richtige Code '<>n__FabricatedMethod1'<class T>
sein sollte. Ist es ein Fehler? Übrigens, ohne (Lambda-Ausdruck ist der gleiche), der Code funktioniert gut mit Syntax Zucker.
Action good = new Action(base.Foo<string>());
good(); //fine
EDIT ich VS2012 RTMRel in windows8 RTM bin mit .NET Framework 4.5
EDIT Dieser Fehler ist nun behoben.
Ihr Code funktioniert für mich. Welche Version von C# /. Net/Visual Studio verwenden Sie? Auf welche Plattform zielen Sie? – jeroenh
@jeroenh: C# 4.5 VS2012. –
Ich versuchte mit VS2010, C# 4 und 3.5. Habe gerade keinen Zugang zu 2012, werde es aber heute Abend versuchen. – jeroenh