При каких входах 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) специальной обработки имен. (Что может отличаться от компилятора к компилятору).