Question

Est-ce un bogue dans le compilateur Microsoft C # ou la syntaxe ne servent un but que je ne suis pas au courant?

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

modifier. Je dois mentionner qu'il compile très bien dans VS2010

Était-ce utile?

La solution

Cela fonctionne parce que vos classes imbriquées héritent de la classe ils sont imbriqués dans.

P3 est un P2, qui est un P1, P2 qui a une imbriqué.

Autres conseils

Je viens de coller votre code dans le compilateur et a couru le désassembleur sur la 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

Ainsi, la recherche à l'IL généré, je pense que « ceci » représente p2 bien plus, techniquement, il est p3. Mais P3 est également P2 P3 parce que dérive de P2.

Ceci est ma compréhension. S'il vous plaît me corriger si je me trompe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top