2011-12-26 2 views
0

я застрял с этой простой ищет код более часа теперь ... У меня есть несколько классов ... и такие методы, как это:Передача ICollection как аргумент

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 

As Я думаю, что в try1 и try2 runtime решает type для ключевого слова new на основе переданного ему параметра. Но в try3 параметры имеют разные типы, а время выполнения не может решить для наилучшего type для ключевого слова new.

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

+0

Проблема заключается в том, что он не может создать коллекцию класса, поскольку arg1 и arg2 разные. Попробуйте наложить их на базовый тип – snurre

ответ

3

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

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

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

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

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

@Saeed: нет необходимости, так как есть неявное преобразование из ClassAction2. Вам просто нужен правильный тип, чтобы быть в наборе кандидатов. –

+0

Я всегда был вашим поклонником ... сегодня ты сделал меня своим AC ... LOL ... он отлично поработал ... ты сделал мой день ... спасибо – Sandy

3

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

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

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

+0

Спасибо ... за вашу помощь ... помогите оценить – Sandy

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