В спецификации CLI ( ECMA 335 ), раздел II, раздел 21, указано:
Несмотря на то,
любой определенный пользователем тип может быть использован в качестве атрибута, соответствие CLS требует, чтобы атрибуты были экземплярами
типы с базовым классом System.Attribute
.
Другими словами, язык, который не совместим с CLS, может позволять вам указывать атрибуты, которые не являются производными от Attribute
, поэтому метод GetCustomAttributes
, вероятно, предназначен для использования таких атрибутов.
Я почти уверен, что такого не-CLS-совместимого языка не существует, и .NET не поддерживает его, но можно представить, что разработчики Reflection не хотели исключать такую возможность в будущем.
Что касается вашего второго вопроса, быстрая проверка исходного кода для System.Reflection
показывает, что вы всегда получаете Attribute[]
обратно. Поскольку возвращаемые объекты всегда Attribute[]
, вы можете безопасно их разыграть, но нет гарантии, что они всегда будут работать таким образом.