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