2012-04-12 5 views
3

У меня есть метод, который хотел бы взять в качестве параметра массив пользовательских Enum типов.Что такое «общий» тип для массива enum?

Что-то, что будет выглядеть как этот:

public void DoSomething(WhatDoIPutHere[] parameters) 

Я хотел бы перейти к этому методу либо Enum1[] или Enum2[] где Enum1 и типа.

Что необходимо для использования вместо WhatDoIPutHere?

я ожидал бы определить подпись DoSomething, как Enum[], как-то Enum является базовым классом для типов Enum (справа):

public void DoSomething(Enum[] parameters) 

но это дает:

не может конвертировать из 'xxx.Enum1 []' в 'System.Enum []'

Я также пробовал определить его как object[], но я получаю такую ​​же ошибку компилятора ..

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

ответ

6

Вы не можете. Матрицы типов значений не являются ковариантными. Вы вроде хотите написать:

public void DoSomething<T>(T[] parameters) where T : struct, System.Enum 

... но это не имеет ни (параметры типа не могут быть ограничены, чтобы быть перечислений или делегатов).

Варианты:

  • Allow любой массив:

    public void DoSomething(Array parameters) 
    
  • Разрешить любой массив типов значений:

    public void DoSomething<T>(T[] parameters) 
    
  • Используйте Unconstrained Melody написать первую форму, через IL-переписывание ha ск.

+0

Вау, спасибо, это был быстрый и тщательный ответ! Я поеду для первого варианта, тогда ... Я не могу сильно изменить подпись метода слишком много (например, добавить общий тип), поэтому вариант 2 отсутствует ... и вариант 3. Мне, вероятно, нужно будет изучить это, но в другой раз :) – tsimbalar

Смежные вопросы