See the following 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();
throws an exception. Inside the generated CIL of the method Bang
I got:
call instance void ConsoleApp.Derived::'<>n__FabricatedMethod1'<string>()
and the signature of the compiler generated method:
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 }
I think the correct code should be '<>n__FabricatedMethod1'<class T>
. Is it a bug? By the way, without using delegate{ }
(lambda expression is the same), the code works fine with syntax sugars.
Action good = new Action(base.Foo<string>()); good(); //fine
EDIT I'm using VS2012 RTMRel in windows8 RTM, .net framework 4.5
EDIT This bug is now fixed.
It is confirmed as a bug and now fixed
Update: the Connect article no longer exists. The bug is fixed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With