"Класс <T>, где T: Enum" не работает
Возможный дубликат:
Создать общий метод, ограничивающий T до Enum
Есть ли причина, по которой мы не можем сделать это на С#? И, если возможно, как я могу сделать что-то подобное!
Что я хочу:
public class<T> ATag where T : enum {
[Some code ..]
}
public class<T> classBase where T : enum {
public IDictionary<T, string> tags { get; set; }
}
Итак, когда наступит время его называть, я получаю только одно из моих значений перечисления.
public class AClassUsingTag : classBase<PossibleTags> {
public void AMethod(){
this.tags.Add(PossibleTags.Tag1, "Hello World!");
this.tags.Add(PossibleTags.Tag2, "Hello Android!");
}
}
public enum PossibleTags {
Tag1, Tag2, Tag3
}
Сообщение об ошибке: "Constraint cannot be special class 'System.Enum'"
Спасибо!
Ответы
Ответ 1
Вы не можете этого сделать, потому что спецификация говорит, что вы не можете, в принципе. Это раздражает, но так оно и есть. CLR поддерживает его без проблем. Я предполагаю, что, когда генерические средства сначала разрабатывались, CLR, возможно, не поддерживал его, поэтому это было запрещено и на языке... и либо команда С# не получала напоминание об этом, а затем поддерживалась, или это было слишком поздно тоже включить его. Делегаты также раздражают.
Что касается обходного пути... посмотрите на мой проект Unconstrained Melody. Вы можете использовать тот же подход самостоятельно. В то же время я написал сообщение
Ответ 2
это невозможно. Но если вы заинтересованы в проверке времени выполнения, вы можете сделать
class A<T>
{
static A()
{
if(!typeof(T).IsEnum)
{
throw new Exception();
}
}
}
Ответ 3
Нет, я так не верю. Да используйте шаблон проектирования, чтобы обойти его, вернуть базовый класс типа, который разрешен, и производные классы могут проверить его.
НТН.