"Класс <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

Нет, я так не верю. Да используйте шаблон проектирования, чтобы обойти его, вернуть базовый класс типа, который разрешен, и производные классы могут проверить его.

НТН.