C# يسمح بالإشارة العكسية إلى الطبقة المتداخلة؟
-
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.
هذا هو فهمي. يرجى تصحيح لي إذا كنت مخطئا.
لا تنتمي إلى StackOverflow