Подтвердить что ты не робот

Почему ToString() для общих типов имеет квадратные скобки?

Почему new List<string>().ToString(); возвращает следующее:?

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

Почему бы просто не вернуть System.Collections.Generic.List<System.String>. Что со странным синтаксисом не С#?

4b9b3361

Ответ 1

Поскольку скобки <> - это синтаксис С#. Реализация System.Object.ToString() возвращает имя типа с синтаксисом CLR.

Рассмотрим это:

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

Выглядит хорошо, когда вы развиваетесь в С#, но говорите, что вы вызываете ToString из С++/CLI. Вы ожидали бы вместо этого следующего?

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

Очевидно, что поведение не должно меняться в зависимости от того, на каком языке был скомпилирован вызывающий, поэтому возвращаемая строка нечувствительна к языку.


На этой странице MSDN перечислены соглашения об именах типов, используемые CLR. (Спасибо Мэтью Уотсон за ссылку).

Что касается arity (часть `1), вы можете найти дополнительную информацию в ECMA-335 (спецификация CLI):

I.10.7.2 Имена типов и кодировка arity

Стандартные имена типа CLS кодируются с использованием формата name[`arity], где [...] указывает, что символ серьезного акцента ` и arity вместе являются необязательными. Закодированное имя должно следовать следующим правилам:

  • name должен быть идентификатором (см. раздел II), который не содержит символ `.
  • arity указывается как беззнаковое десятичное число без начальных нулей или пробелов.
  • Для обычного общего типа arity - это количество параметров типа, объявленных в типе.
  • Для вложенного родового типа arity - это количество вновь введенных параметров типа.