Почему С# не позволяет использовать универсальные типы в качестве атрибутов внутри универсального класса?

Это не очень важный вопрос, мне только любопытно, почему это не разрешено. Сообщение об ошибке не помогает при объяснении, потому что очевидно, что "Att" наследуется от Attribute.

public class Generic<Att> where Att : System.Attribute
{
    [Att] //Error: 'Att' is not an attribute class
    public float number;
}

Ответ 1

Атрибут должен быть определен во время компиляции только потому, что он хранится в dll или exe. И может содержать только созданную во время компиляции информацию. Таким образом, это не может быть общим по этой причине.

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

В вашем примере вы хотите пометить поле универсальным параметром:

public class Generic<Att> where Att : System.Attribute
{
    [Att] //Error: 'Att' is not an attribute class
    public float number;
}

Но это равно:

public class Generic<Att> where Att : System.Attribute
{
    [Attribute]
    public float number;
}

Потому что Att не может быть заменен в будущем. Таким образом, нет причин использовать дженерики для атрибутов.