为什么泛型类型的ToString()有方括号?

时间:2016-10-13 11:05:43

标签: c# generics

为什么new List<string>().ToString();会返回以下内容:?

System.Collections.Generic.List`1[System.String]

为什么它不会带回System.Collections.Generic.List<System.String>。 什么是奇怪的非C#语法?

1 个答案:

答案 0 :(得分:18)

因为<>括号是C#语法。 System.Object.ToString()实现返回带有CLR语法的类型名称。

考虑一下:

System.Collections.Generic.List<System.String>

在使用C#进行开发时看起来不错,但是说你从C ++ / CLI调用ToString。你会期待以下情况吗?

System::Collections::Generic::List<System::String>

显然,行为不应该根据调用者编写的语言而改变,因此返回的字符串与语言无关。

This MSDN page列出了CLR使用的类型名称约定。 (感谢Matthew Watson链接)。

至于arity(`1部分),您可以在ECMA-335(CLI规范)中找到更多信息:

  

I.10.7.2类型名称和arity编码

     

符合CLS的通用类型名称使用格式name[`arity]进行编码,其中[...]表示严重重音字符` arity 一起是可选的。编码名称应遵循以下规则:

     
      
  1. name 应为不包含`字符的ID(请参阅分区II)。
  2.   
  3. arity 指定为无符号十进制数,不带前导零或空格。
  4.   
  5. 对于普通泛型类型, arity 是在类型上声明的类型参数的数量。
  6.   
  7. 对于嵌套泛型类型, arity 是新引入的类型参数的数量。
  8.