Compiler generated incorrect code for anonymous methods [MS BUG FIXED]
.net, anonymous-methods, c#, cil, delegates
Solution
It is confirmed as a bug and now fixed
Update: the Connect article no longer exists. The bug is fixed.
Problem
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.