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

19

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

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

为什么它不直接返回System.Collections.Generic.List<System.String>呢?奇怪的非C#语法是怎么回事?


3
如果您想用<>括号获取名称,请参考此链接:https://dev59.com/7W3Xa4cB1Zd3GeqPaxr4#14284719 - Artiom
投票关闭此问题的人,因为它是基于观点的,请问这是基于观点的吗?所提供的答案完全客观。 - David Klempfner
1个回答

18
因为<>括号是C#语法。 System.Object.ToString()的实现会使用CLR语法返回类型名称。
考虑这个:
System.Collections.Generic.List<System.String>

在C#开发中看起来不错,但如果你从C++/CLI调用ToString,你会期望得到以下结果吗?

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

显然,该行为不应基于调用方编译的语言而改变,因此返回的字符串是语言中性的。


这个MSDN页面列出了CLR使用的类型名称约定。(感谢Matthew Watson提供链接)。

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

I.10.7.2 类型名称和元数编码

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

  1. name必须是不包含`字符的ID(参见第II部分)。
  2. arity被指定为无前导零或空格的无符号十进制数。
  3. 对于正常的泛型类型,arity是在类型上声明的类型参数数量。
  4. 对于嵌套的泛型类型,arity是新引入的类型参数的数量。

6
请参见此处的链接(https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx),其中列出了用于CLR类型名称的所有不同符号的表格。 - Matthew Watson
1
@MatthewWatson 谢谢您提供链接,我正试图在文档中找到这个,如果您不介意的话,我会将其添加到答案中。 - Lucas Trzesniewski
希望我能再点一次赞,以表扬添加CLI规范的贡献。 :) - Gilad Green
@GiladGreen :-) - Lucas Trzesniewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接