通过测验了解C#中的嵌套generics类

在和同事谈论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(oaGetType()); Console.WriteLine(obGetType()); Console.WriteLine(ocGetType()); Console.ReadKey(); } } 

输出是:

 System.Boolean System.Char System.Int32 

如果我错了,纠正我,但我知道oa是booltypes,因为C<T3>B<T3> B<T2>inheritance, B<T2>A<T2>inheritance。 而且我还可以稍微理解一下, oc是inttypes的,因为c的types是从外部类(我认为)获得的T1

当我试图弄清楚为什么ob是chartypes的时候,我的头几乎爆炸了。 谁可以给我解释一下这个?

这是一个古老的难题,这是相当困难的。 当我把它交给安德斯自己的时候,他第一次没有得到答案!

我认为你的同事给你的版本来自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

我的版本的解决scheme在这里:

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 {} } } } 

然后, PXDNBXinheritance,而不是从PXinheritance。 这个难题使得嵌套的genericstypes可以通过“外部”和“基础”searchpath来命名相同的声明,但是由于generics构造的不同,它们的含义各不相同

无论如何,阅读博客文章的解释,如果它仍然不清楚,问一个更具体的问题。

好的,我的第一个答案是错的。 嵌套是重要的:

obGetType() b是周围类的成员,它实例化为B<char> ,它inheritance自A<char> ,这又使T1等于char。 不太清楚的是以下内容(手动实例A_int.B_char.C_bool ):

 public class A_bool { public bool a; public class B_bool : A_bool { public bool b; } } public class A_char { public char a; public class B_bool : A_bool { public char b; } } public class A_int { public int a; public class B_char : A_char { public int b; public class C_bool : A_char.B_bool { public int c; } } } 

这里C_bool也可以从A_bool.B_bool派生,对不对? 但是因为我们嵌套在A_charA_char这是首选。