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

145
14

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

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

спросил(а) 2021-01-14T00:32:24+03:00 1 неделя назад
1
Решение
73

Атрибут должен быть определен во время компиляции только потому, что он хранится в 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 не может быть заменен в будущем. Таким образом, нет причин использовать дженерики для атрибутов.

ответил(а) 2021-01-14T00:32:24+03:00 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема