传递ICollection作为参数

时间:2011-12-26 13:23:28

标签: c# generics c#-4.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

我认为,在try1和try2运行时,根据传递给它的参数决定关键字type的{​​{1}}。但是在try3中,参数的类型不同,运行时无法确定new关键字的最佳type

感谢。如果需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:3)

隐式类型数组仅在数组元素的类型是一个元素的确切编译时类型时才起作用。换句话说,编译器将元素类型集视为候选类型的集合,然后尝试找到其中所有其他类型可以隐式转换的类型之一。

在您的情况下,候选类型集合为ClassAction1ClassAction2,两者都不可隐式转换为另一种 - 这就是您遇到编译器错误的原因。因此,您需要明确说明所需的元素类型 - 大概是ClassBase<MyInterface>

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

或者,您可以投射其中一个或两个元素:

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

答案 1 :(得分:2)

只是这样做:

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

实际上,在一个数组中,您不能拥有不同的对象类型。您应该将它们转换为您的案例中的相同对象类型,因为最后您的SomeClass中有一个类型为ClassBase<MyInterface>的对象,因此您应该将其强制转换为ClassBase<MyInterface>。在你的第一个样本中,这个演员阵容可以隐式完成,但在你的第二个样本中却不能。