Передача ICollection в качестве аргумента - PullRequest
0 голосов
/ 26 декабря 2011

Я застрял с этим простым на вид кодом уже более часа ... У меня мало классов ... и таких методов:

abstract class ClassBase<SampleInterface> {//Some methods};

public class ClassAction1: ClassBase<MyInterface> {//Some methods};

public class ClassAction2: ClassBase<MyInterface> {//Some methods};

class SomeClass
{ 
    public void AddClassRange(ICollection<ClassBase<MyInterface>> range)
    {
        foreach (ClassBase<MyInterface> ClassBase in range)
            AddClass(ClassBase);
    }


    public void AddClass(ClassBase<MyInterface> behavior)
    {
        // Something
    }
}

Теперь я пытаюсь использовать эти коды в другом классе:

var arg1 = new ClassAction1 {//Something};
var arg2 = new ClassAction2 {//Something};

//try1
sampleElement.AddClassRange(new [] { arg1 });   // works fine

//try2
sampleElement.AddClassRange(new [] { arg2 });   // works fine

Я хочу объединить try1 и try2:

// Something like this (try3)
sampleElement.AddClassRange(new [] { arg1, arg2 });   // Error
Error : No best type found for implicitly typed array

Как я думаю, во время выполнения try1 и try2 type для ключевого слова new определяется на основе переданного ему параметра. Но в try3 параметры бывают разных типов, и во время выполнения не удается выбрать лучший type для ключевого слова new.

Спасибо. Дайте мне знать, если вам нужно больше информации.

Ответы [ 2 ]

3 голосов
/ 26 декабря 2011

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

В вашем случае набор возможных типов - ClassAction1 и ClassAction2, ни один из которых неявно конвертируется в другой - вот почему вы получаете ошибку компилятора.Таким образом, вам нужно явно указать желаемый тип элемента - предположительно ClassBase<MyInterface>:

sampleElement.AddClassRange(new ClassBase<MyInterface>[] { arg1, arg2 });

В качестве альтернативы, вы можете привести один или оба элемента:

sampleElement.AddClassRange(new[] { (ClassBase<MyInterface>) arg1, arg2 });
2 голосов
/ 26 декабря 2011

просто сделайте:

sampleElement.AddClassRange
   (new [] { arg1 as ClassBase<MyInterface>,  arg2 as ClassBase<MyInterface>})

Фактически, в одном массиве вы не можете иметь разные типы объектов.Вы должны привести их к тому же типу объекта в вашем случае, потому что наконец у вас есть объект типа ClassBase<MyInterface> в вашем SomeClass, поэтому вы должны привести его к ClassBase<MyInterface>.В вашем первом примере это приведение может быть выполнено неявно, но во втором примере это невозможно.

...