为什么运行时将泛型类型显示为“GenericType`n”?

时间:2009-09-26 20:52:25

标签: .net generics reflection types

为什么不显示真实的类型(例如:List< string>而不是List`1)?
这个奇怪的(对我来说)符号来自哪里?

3 个答案:

答案 0 :(得分:8)

具有一个类型参数的通用List<T>的CLR名称是

System.Collections.Generic.List`1

List<T>是命名该类型的C#样式。

符号是一种定义的约定,使您能够通过参数计数重载泛型类型。如果您声明一个名为List的类具有两个类型参数(例如List<T,U>),编译器将能够选择正确的类。它将被命名为:

System.Collections.Generic.List`2

和非通用List类将命名为:

System.Collections.Generic.List

请注意,CLR不会要求泛型类型。这只是编译器能够选择正确类型的惯例。

答案 1 :(得分:4)

它没有显示List<string>,因为它是C#依赖语法。 .Net源代码中的List可以声明为List<string>List(Of String)或任何其他可以编译为MSIL的60种左右的语言/语法。

所以你看到的是更通用的MSIL语法。

`1表示它是一个具有一个通用参数的List。

答案 2 :(得分:2)

`1是泛型类型的MSIL语法 - List<T>是C#特有的。更多MSIL示例:

List<T> == System.Collections.Generic.List`1
List<string> == System.Collections.Generic.List`1[System.String]
Dictionary<string, int> == 
   System.Collections.Generic.Dictionary`2[System.String, System.Int32]