2

これはMicrosoftC#コンパイラのバグですか、それとも構文が私が知らない目的を果たしているのでしょうか?

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

編集:私はそれがVS2010でうまくコンパイルされることを言及する必要があります。

4

2 に答える 2

5

これは、ネストされたクラスがネストされたクラスから継承するために機能します。

P3はP2であり、これはP1であり、ネストされたP2があります。

于 2010-12-02T23:50:35.070 に答える
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を見ると、「これ」はp2を表しているように感じますが、より技術的にはp3です。ただし、P3はP2から派生しているため、P3もP2です。

これが私の理解です。私が間違っている場合は訂正してください。

于 2010-12-02T23:58:30.920 に答える