奇怪的反编译的代码认购代码泛型类

问题描述:

这个简单的类奇怪的反编译的代码认购代码泛型类

public class Test<T> 
{ 
    public static void A(Window wa, Window wb) 
    { 
     wa.Closed += (s, e) => wb.Close(); 
    } 
} 

被编译到这个(我使用反射来编译):

public class Test<T> 
{ 
    [CompilerGenerated] 
    private sealed class <>c__DisplayClass1 
    { 
     public Window wb; 

     public void <A>b__0(object s, EventArgs e) 
     { 
      this.wb.Close(); 
     } 
    } 

    public static void A(Window wa, Window wb) 
    { 
     wa.Closed += delegate(object s, EventArgs e) 
     { 
      base.wb.Close(); 
     }; 
    } 
} 

是什么意思base?如果从未使用过,为什么会生成<>c__DisplayClass1? 这是一个Reflector bug吗?

编辑: 的确,好像在这种情况下,反射器优化不沃金非常好,禁用优化的反编译的代码是有道理的:

public class Test<T> 
{ 
    public Test() 
    { 
     base..ctor(); 
     return; 
    } 

    public static void A(Window wa, Window wb) 
    { 
     <>c__DisplayClass1<T> CS$<>8__locals2; 
     CS$<>8__locals2 = new <>c__DisplayClass1<T>(); 
     CS$<>8__locals2.wb = wb; 
     wa.Closed += new EventHandler(CS$<>8__locals2.<A>b__0); 
     return; 
    } 

    [CompilerGenerated] 
    private sealed class <>c__DisplayClass1 
    { 
     // Fields 
     public Window wb; 

     public <>c__DisplayClass1() 
     { 
      base..ctor(); 
      return; 
     } 

     public void <A>b__0(object s, EventArgs e) 
     { 
      this.wb.Close(); 
      return; 
     } 
    } 
} 
+0

这是一个很好的问题。我明白为什么你需要帮助类来捕获'wb'上的闭包,但我不明白'A'中实际生成的代码,它似乎没有使用助手。 – 2010-07-01 15:05:22

反射器“优化”输出去尝试想出C#可能的样子。我不知道“基地”位是从哪里来的,但是,生成的类别的确是肯定被使用。

将反射器选项设置为“未优化”,您将看到更像IL到C#的直接转换。或者只需切换到IL并直接阅读,如果你想要一个非常原始的视图。

+0

谢谢@Jon Skeet! – 2010-07-01 15:15:05