通过测验了解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 {} } } }
然后, PXDN
从BX
inheritance,而不是从PX
inheritance。 这个难题使得嵌套的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_char
, A_char
这是首选。