C # допускает обратную ссылку на вложенный класс? - PullRequest
2 голосов
/ 03 декабря 2010

Это ошибка в компиляторе Microsoft C #, или синтаксис служит цели, о которой я не знаю?

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

edit: я должен упомянуть, что она прекрасно компилируется в VS2010.

Ответы [ 2 ]

5 голосов
/ 03 декабря 2010

Это работает, потому что ваши вложенные классы наследуются от класса, в который они вложены.

P3 - это P2, то есть P1, который имеет вложенный P2.

0 голосов
/ 03 декабря 2010

Я просто вставил ваш код в компилятор и запустил дизассемблер на 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, я чувствую, что «this» представляет p2, хотя технически это p3.Но P3 также является P2, потому что P3 происходит от P2.

Это мое понимание.Пожалуйста, поправьте меня, если я ошибаюсь.

...