2010-12-02 8 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でうまくコンパイルすることを言及する必要があります。

+0

以前、私はhttp://stackoverflow.com/questions/455928/net-nested-classesを見ていなかったことをお詫びします。これは基本的に似ています。 –

答えて

5

あなたのネストされたクラスは、彼らがにネストされているクラスから継承するので、これは動作します。

P3ネストされたP2を持っP1でP2、、です。

+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 

だから発生したILを見て、私は「これは」しかし、より技術的にそれがP3であるP2を表していることを感じます。しかし、P3はP2から導出されるので、P3もP2である。

これは私の理解です。私が間違っていれば私を修正してください。

関連する問題