Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compiler generated incorrect code for anonymous methods [MS BUG FIXED]

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.

like image 848
Cheng Chen Avatar asked Oct 10 '12 06:10

Cheng Chen


1 Answers

It is confirmed as a bug and now fixed

Update: the Connect article no longer exists. The bug is fixed.

like image 91
Cheng Chen Avatar answered Oct 04 '22 04:10

Cheng Chen