Какие имена типов С# являются специальными?

При каких входах IsSpecialName возвращает true? Из моего краткого исследования я обнаружил, что аксессоры свойств и перегрузки операторов имеют специальные имена, наряду с любым типом с именем, которое содержит символ подчеркивания. Может ли кто-нибудь дать мне полное описание случаев, когда имя типа является особенным?

Ответ 1

Спецификация CLI, опубликованная в ECMA-335, является достойным источником информации, подобной этой. Найдите документ для rtspecialname (имена, которые являются особыми для CLR) и specialname (имена, которые являются особыми для инструментов. Атрибут specialname включается для rtspecialnames. Предоставление этих обращений:

  • В базовом поле value__ перечисляемого типа
  • Методы доступа getter и setter свойства
  • Способы добавления, удаления и доступа к аксессуарам события
  • Перегрузка оператора
  • Метод .ctor для класса, конструктор
  • Метод .cctor для класса, статический конструктор

Ответ 2

Прежде всего, IsSpecialName не принимает никаких данных. Также свойство Type на самом деле не применимо к активаторам свойств или перегрузкам операторов, поскольку свойство Type и операторов /accessors не являются типами. Это несмотря на то, что может сообщить вам статья MSDN.

Я бы рискнул предположить, что он возвращает true, когда корреспондент TypeAttribute - SpecialName. Вы можете обратиться к стандарту ECMA 335, чтобы узнать, что должно быть помечено как специальное имя. Кстати, вы узнаете, что это такие вещи, как операторы и аксессоры свойств. Это объясняет, откуда может возникнуть путаница в статье MSDN.

Я считаю, что в Type это свойство реализовано в основном для компиляторов и такое, что может потребовать дополнительной (по сравнению с мандатом ECMA 335) специальной обработки имен. (Что может отличаться от компилятора к компилятору).