同僚と C# について話していたとき、出力を予測しなければならない C# コードをいくつか見せられました。これは一見単純に見えましたが、そうではありませんでした。C# がなぜこのように動作するのか、私にはよくわかりません。
コード:
public class A<T1>
{
public T1 a;
public class B<T2> : A<T2>
{
public T1 b;
public class C<T3> : B<T3>
{
public T1 c;
}
}
}
class Program
{
static void Main(string[] args)
{
A<int>.B<char>.C<bool> o = new A<int>.B<char>.C<bool>();
Console.WriteLine(o.a.GetType());
Console.WriteLine(o.b.GetType());
Console.WriteLine(o.c.GetType());
Console.ReadKey();
}
}
出力は次のようになります。
System.Boolean
System.Char
System.Int32
間違っていたら訂正してください。ただし、 はを継承し、は を継承しているo.a
ので、 は bool 型であると理解しています。また、 の型は であり、外部クラスから取得されるため(だと思う)、はint 型であるとも少しは理解できます。C<T3>
B<T3>
B<T2>
A<T2>
o.c
c
T1
なぜ が char 型なのかを理解しようとすると、頭が爆発しそうになりますo.b
。誰か説明してくれませんか?
ベストアンサー1
これは古いパズルで、かなり難しいです。アンダース本人にこのパズルを与えたところ、彼は一度では正解できませんでした。
同僚があなたに渡したバージョンは、Cyrus のブログからのものだと思います:
http://blogs.msdn.com/b/cyrusn/archive/2005/08/01/446431.aspx
もう少し簡単なバージョンが私のブログにあります。
http://blogs.msdn.com/b/ericlippert/archive/2007/07/27/an-inheritance-puzzle-part-one.aspx
私のバージョンの解決策は次のとおりです:
http://blogs.msdn.com/b/ericlippert/archive/2007/07/30/an-inheritance-puzzle-part-two.aspx
簡単に言うと、混乱を招く動作の原因は、外部クラスと基本クラスの両方に存在する名前がある場合、基本クラスが「優先」されることです。つまり、次の場合です。
public class B
{
public class X {}
}
public class P
{
public class X
{
public class D : B
{
public class N : X {}
}
}
}
はではなく からP.X.D.N
継承します。このパズルは、同じ宣言を「外側」と「ベース」の両方の検索パスで指定できるような方法でネストされたジェネリック型を作成しますが、B.X
P.X
違う一般的な構造のため、それぞれに意味があります。
とにかく、ブログ投稿の説明を読んで、それでも不明な場合は、より具体的な質問をしてください。