2010-12-02 2 views
2

이 버그는 Microsoft C# 컴파일러의 버그입니까, 아니면 인식하지 못하는 목적을위한 구문을 제공합니까?C#은 중첩 클래스에 대한 역 참조를 허용합니까?

class P1 
{ 
    class P2 : P1 
    { 
     class P3 : P2 
     { 
      void Foo() 
      { 
       P3 p3 = this as P2.P3; 
       P2 p2 = this as P3.P2; // ?!? 
      } 
     }; 
    }; 
}; 

편집 : VS2010에서는 정상적으로 컴파일됩니다. 당신의 중첩 된 클래스들이 P3가 중첩 된 P2가있는 P1, 인 P2이다에.

내포하고있는 클래스에서 상속 때문에

+0

감사합니다. 이전에 http://stackoverflow.com/questions/455928/net-nested-classes를 보지 못했음을 사과드립니다. 이는 기본적으로 비슷합니다. –

답변

5

이 작동합니다.

+1

파생 된 클래스를 통해 정적 멤버를 참조하면 Resharper (및 VS)가 경고하므로이 같은 혼란을 완화하는 데 도움이됩니다. –

0

나는 방금 컴파일러에 코드를 붙여 넣었고 dll에서 디스어셈블러를 실행했습니다.

.method private hidebysig instance void Foo() cil managed 
{ 

    // Code size  6 (0x6) 
     .maxstack 1 
     .locals init ([0] class ProjectEuler.P1/P2/P3 p3, 
     [1] class ProjectEuler.P1/P2 p2) 
     IL_0000: nop 
     IL_0001: ldarg.0 
     IL_0002: stloc.0 
     IL_0003: ldarg.0 
     IL_0004: stloc.1 
     IL_0005: ret 



}// end of method P3::Foo 

이렇게 생성 된 일리노이를 보면, '이것은'기술적으로 p3이지만 '이'는 p2를 나타냅니다. 그러나 P3는 P2에서 파생되므로 P3도 P2입니다.

이것은 제 이해입니다. 내가 틀렸다면 나를 바로 잡아주세요.