Использование enum в качестве типичного параметра типа в С#

Возможный дубликат:
Ограничения типа Enum в С#

Можно ли использовать типы enum в качестве общего параметра с помощью его класса-оболочки enum?

У меня разные перечисления:

enum errors1 { E1, E3, E8 };
enum errors2 { E0, E2, E9 };
enum errors3 { E7, E4, E5 };

Со следующим объявлением класса я думал, что смогу его достичь:

public class MyErrors<T> where T : Enum
{
   T enumeration;

   public T getEnumeration()
   {
       return enumeration;
   }

   static void Main(string[] args)
   {

       Program<error1> p = new Program<error1>();
       p.getEnumeration().E1  // this call does NOT work
   }

Однако, поскольку общий тип enum, я могу получить доступ только к члену и методам класса enum. Так можно ли реализовать его так, как я хотел или какой другой подход использовать?

Ответ 1

Нет, к сожалению, это невозможно. Лучшее, что вы можете сделать, это использовать where T : struct, IComparable, IConvertible, IFormattable (что, конечно, не одно и то же). Ограничения интерфейса основаны на реализации System.Enum.

Кроме того, вы можете проверить, есть ли typeof(T).IsEnum, который может обнаружить проблему во время выполнения и предположительно выбросить исключение. Но во время компиляции нельзя использовать это ограничение.

Ответ 2

Это не выполнимо на уровне языка в С#, но оно поддерживается базой CLR. Вы можете использовать Jon Skeet Unconstrained Melody, который преобразует сгенерированный двоичный код в один с фактическим общим ограничением enum.