C# يسمح بالإشارة العكسية إلى الطبقة المتداخلة؟

StackOverflow https://stackoverflow.com/questions/4341166

  •  30-09-2019
  •  | 
  •  

سؤال

هل هذا خطأ في برنامج التحويل البرمجي Microsoft 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 متداخل.

نصائح أخرى

لقد لصق الكود الخاص بك في برنامج التحويل البرمجي وقمت بتشغيل disassembler على 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.

هذا هو فهمي. يرجى تصحيح لي إذا كنت مخطئا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top