Какое использование имеют атрибуты для общих параметров?

Действителен (т.е. компилирует и запускает), чтобы поместить атрибут в общий параметр для класса или метода:

public class MyClass<[My] T>
{
    private void MyMethod<[My] T>()
    {}
}

public class MyAttribute : Attribute
{}

Я никогда не видел, чтобы это использовалось, и я изо всех сил пытаюсь объяснить причину, почему вы захотите.

Является ли это просто причудой/побочным эффектом спецификации языка или существует ли обоснованная/полезная причина для размещения атрибута в этой позиции?

Ответы

Ответ 1

По той же причине атрибуты полезны для любой конструкции; они предоставляют метаданные, которые могут использоваться Reflection или другими постпроцессорами для выполнения различных задач. Например, у вас может быть система АОП, которая использует атрибут в аргументе типа для применения определенных ограничений времени выполнения, которые иначе не могли быть выражены. Я не уверен, есть ли какие-либо системы, которые фактически используют эти атрибуты, чтобы что-либо сделать, но нет никаких причин запрещать их как метаданные.

Ответ 2

Я уверен, что какой-то орех AOP найдет правильную причину, чтобы украсить общие параметры атрибутами. Я, конечно, не могу думать ни о чем. Попробуйте следующее:

typeof(MyClass<>).GetGenericArguments().GetCustomAttributes().OfType<MyAttribute>();

Если этот Enumerable имеет какие-либо элементы, тогда можно получить доступ к атрибуту, который вы поместили в общий параметр класса. Если нет, то вы не можете и, следовательно, иметь данные, которые вы ожидаете получить от любого другого класса в вашей кодовой базе, бессмысленно. ОДНАКО, у них все еще может быть код, который запускается при создании экземпляра, и он создается экземпляром среды выполнения, когда общий класс входит в область видимости, что позволяет выполнять аспектно-ориентированную логику в самом атрибуте. Точно, что бы это было и как это было бы иначе, чем украшать общий класс или метод напрямую, остается как упражнение для людей, которые поклоняются АОП гораздо больше, чем я.