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を備えています。
他のヒント
コンパイラにコードを貼り付けて、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