C#基类的未绑定泛型类型不可用?

时间:2013-03-23 07:52:27

标签: c# generics

我在使用C#中的泛型时遇到了奇怪的行为。请考虑以下代码:

class CEmployee<T> { }
class CManager<T> : CEmployee<T> { }

class Program
{
    static void Main(string[] args)
    {
        CManager<String> cemp = new CManager<String>();
        Console.WriteLine(cemp.GetType());
        Console.WriteLine(cemp.GetType().FullName);
        Console.WriteLine(cemp.GetType().BaseType);
        Console.WriteLine(cemp.GetType().BaseType.FullName);
        Console.WriteLine(1);
        Console.WriteLine(cemp.GetType().GetGenericTypeDefinition());
        Console.WriteLine(cemp.GetType().GetGenericTypeDefinition().FullName);
        Console.WriteLine(cemp.GetType().GetGenericTypeDefinition().BaseType);
        Console.WriteLine(cemp.GetType().GetGenericTypeDefinition().BaseType.FullName); // Problem 1
        Console.WriteLine(2);
        Console.WriteLine(typeof(CManager<>));
        Console.WriteLine(typeof(CManager<>).FullName);
        Console.WriteLine(typeof(CManager<>).BaseType);
        Console.WriteLine(typeof(CManager<>).BaseType.FullName); // Problem 1
        Console.WriteLine(3);
        Console.WriteLine(typeof(CManager<>).Equals(cemp.GetType().GetGenericTypeDefinition()));
        Console.WriteLine(typeof(CEmployee<>).Equals(cemp.GetType().GetGenericTypeDefinition().BaseType)); // Problem 2


    }
}

输出

ConsoleApplication1.CManager`1[System.String]
ConsoleApplication1.CManager`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutr
ConsoleApplication1.CEmployee`1[System.String]
ConsoleApplication1.CEmployee`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neut
1
ConsoleApplication1.CManager`1[T]
ConsoleApplication1.CManager`1
ConsoleApplication1.CEmployee`1[T]

2
ConsoleApplication1.CManager`1[T]
ConsoleApplication1.CManager`1
ConsoleApplication1.CEmployee`1[T]

3
True
False

我很难过为什么未绑定泛型类型的基类不能完全使用:

  1. 当我得到基地的全名时,为什么我什么也得不到 未绑定的泛型类型? (上面代码中的“问题1”)
  2. 为什么我的CManager实例的基本类型是 CEmployee,以及未绑定的基类的类型 输入CManager&lt;&gt;是CEmployee&lt;&gt ;,和未绑定类型CManager “等于”我的实例的泛型类型定义,即基类型 未绑定类型的“等于”通用的基本类型 我的实例的类型定义?? (上面代码中的“问题2”)

1 个答案:

答案 0 :(得分:7)

按相反的顺序:

2:因为基本类型是CEmployee<T>,而不是CEmployee<>。它们是有区别的; CEmployee<>是类型定义; CEmployee<T>绑定到父类型的T。您可以通过查看IsGenericTypeDefinitionGetGenericArguments()[0]

来查看此内容

1:因为没有定义这种泛型类型的FullName。这是fully documented

  

如果当前类型包含尚未被特定类型替换的泛型类型参数(即,ContainsGenericParameters属性返回true),但该类型不是泛型类型定义(即,IsGenericTypeDefinition属性返回false),此属性返回null。

这正是我们在“2”中讨论的内容。