Pet*_*ček 16 c# generics typeof type-parameter
我不明白为什么以下行为完全按照它的方式行事.我甚至不知道它是由隐藏还是其他原因造成的.
class A<T>
{
public class B : A<int>
{
public void b()
{
Console.WriteLine(typeof(T).ToString());
}
public class C : B
{
public void c()
{
Console.WriteLine(typeof(T).ToString());
}
}
public class D : A<T>.B
{
public void d()
{
Console.WriteLine(typeof(T).ToString());
}
}
}
}
class Program
{
static void Main(string[] args)
{
A<string>.B.C c = new A<string>.B.C();
A<string>.B.D d = new A<string>.B.D();
c.c();
c.b();
d.d();
d.b();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:
为什么在c.c()
生成时c.b()
生成System.String System.Int32
?
为什么d.d()
和d.b()
两者都产生System.String
和不完全相同的行为C
?
Eri*_*ert 11
这是我多年前在我的博客上发布的一个谜题的变体:
http://blogs.msdn.com/b/ericlippert/archive/2007/07/27/an-inheritance-puzzle-part-one.aspx
在此之前,Cyrus在他的博客上发布了:
http://blogs.msdn.com/b/cyrusn/archive/2005/08/01/446431.aspx
请参阅那里的讨论了解详情.
简而言之:B
意味着class C : B
什么?检查容器class B
.它是否包含任何类型的名称B
?不.然后检查容器的基类.容器的基类是A<int>
.它包含任何名称B
吗?是.所以这意味着class C : A<int>.B
.
现在我们说c
是的A<string>.B.C
.我们呼吁方法A<string>.B.C.c()
什么是T
贯穿A<string>
?显然string
.所以c.c()
打印String
的T
.
现在我们打电话A<string>.B.C.b()
但A<string>.B.C
直接没有这样的方法.它在哪里获得这种方法?从它的基础类.什么是基类?A<int>.B
.所以我们打电话A<int>.B.b()
.什么是T
全A<int>
?显然int
.
现在我们来A<string>.B.D.d()
.基类是无关紧要的.T
是string
贯穿A<string>
.
最后A<string>.B.D.b()
.A<string>.B.D
直接没有这样的方法,所以必须从它的基类型中获取它.T
是string
整个A<string>
的,所以基类型是A<string>.B
.因此这个电话A<string>.B.b()
.
如果这对你没有意义,请拼出一切.让我们用String代替T:
class A_string
{
public class B : A_int
{
public void b()
{
Console.WriteLine(typeof(string).ToString());
}
public class C : A_int.B // Note!
{
public void c()
{
Console.WriteLine(typeof(string).ToString());
}
}
public class D : A_string.B
{
public void d()
{
Console.WriteLine(typeof(string).ToString());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
好的,这是其中一种类型.现在让我们对int做同样的事情:
class A_int
{
public class B : A_int
{
public void b()
{
Console.WriteLine(typeof(int).ToString());
}
public class C : A_int.B // Note!
{
public void c()
{
Console.WriteLine(typeof(int).ToString());
}
}
public class D : A_int.B
{
public void d()
{
Console.WriteLine(typeof(int).ToString());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在给出的类型应该清楚是什么A_string.B.C.c()
,A_string.B.C.b()
等等,所有打印出来.
归档时间: |
|
查看次数: |
591 次 |
最近记录: |