通用嵌套类型中的typeof(T)

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)

问题是:

  1. 为什么在c.c()生成时c.b()生成System.String System.Int32

  2. 为什么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()打印StringT.

现在我们打电话A<string>.B.C.b()A<string>.B.C直接没有这样的方法.它在哪里获得这种方法?从它的基础类.什么是基类?A<int>.B.所以我们打电话A<int>.B.b().什么是TA<int>?显然int.

现在我们来A<string>.B.D.d().基类是无关紧要的.Tstring贯穿A<string>.

最后A<string>.B.D.b().A<string>.B.D直接没有这样的方法,所以必须从它的基类型中获取它.Tstring整个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()等等,所有打印出来.