2010-07-01 4 views
4

이상한 디 컴파일 코드는 제네릭 클래스

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

이 컴파일 취득이 간단한 클래스 (내가 디 컴파일 리플렉터를 사용하고 있습니다) 코드를 구독 base? <>c__DisplayClass1이 사용되지 않는 이유는 무엇입니까? 반사경 버그입니까?

편집 : 사실 , 반사판 최적화는 디 컴파일 코드가 의미가 최적화를하지 않도록,이 경우 매우 잘 워킹되지 않은 것 같아 :

반사경을 시도하는 출력을 "최적화"입니다
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'에서 실제로 생성 된 코드를 이해하지 못합니다. –

답변

1

C#이 어떻게 생겼는지를 생각해 내야합니다. 나는 "베이스"비트가 어디에서 왔는지는 모르지만 ... 생성 된 클래스 은 확실히입니다.

반사체 옵션을 "최적화되지 않음"으로 설정하면 IL에서 C# 직접 변환과 비슷한 것을 볼 수 있습니다. 아니면 그냥 일리노이로 전환하고 직접 읽을 수 있습니다.

+0

@ 존 스 켓에게 감사드립니다! –