Mem*_*sen 60 c# generics inheritance nested
在与同事谈论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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
System.Boolean
System.Char
System.Int32
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我,但我知道这o.a
是bool类型,因为C<T3>
继承自B<T3>
并B<T2>
继承自A<T2>
.我也可以稍微明白o.c
是int类型的,因为类型c
就是T1
它从外部类获取(我认为).
当我试图弄清楚为什么o.b
是char类型时,我的脑袋几乎爆炸了.谁可以给我解释一下这个?
Eri*_*ert 40
这是一个古老的难题,而且非常困难.当我把它交给安德斯本人时,他第一次没有得到正确答案!
我认为你的同事给你的版本来自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
简而言之,混淆行为的原因是,当您在外部类和基类中都存在名称时,基类"wins".也就是说,如果你有:
public class B
{
public class X {}
}
public class P
{
public class X
{
public class D : B
{
public class N : X {}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后P.X.D.N
继承而B.X
不是继承P.X
.这个谜题使得嵌套的泛型类型可以通过"外部"和"基础"搜索路径来命名相同的声明,但由于通用构造,每个都有不同的含义.
无论如何,请阅读博客文章中的解释,如果仍然不清楚,请提出更具体的问题.
好的,我的第一个答案是错的.嵌套很重要:
in o.b.GetType()
b是周围类的成员,它被实例化B<char>
,继承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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这C_bool
可能也来自A_bool.B_bool,对吧?但是因为我们已经嵌套在A_char
那个首选的位置.
归档时间: |
|
查看次数: |
1939 次 |
最近记录: |