new List<string>().ToString();
为什么返回以下内容:
System.Collections.Generic.List`1[System.String]
为什么它不直接返回System.Collections.Generic.List<System.String>
呢?奇怪的非C#语法是怎么回事?
new List<string>().ToString();
为什么返回以下内容:
System.Collections.Generic.List`1[System.String]
为什么它不直接返回System.Collections.Generic.List<System.String>
呢?奇怪的非C#语法是怎么回事?
<>
括号是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一起是可选的。编码的名称应遵循以下规则:
- name必须是不包含
`
字符的ID(参见第II部分)。- arity被指定为无前导零或空格的无符号十进制数。
- 对于正常的泛型类型,arity是在类型上声明的类型参数数量。
- 对于嵌套的泛型类型,arity是新引入的类型参数的数量。