0

我被这个看起来很简单的代码困住了一个多小时......我的课程很少......和这样的方法:

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 运行时根据传递给它的参数决定typefor 关键字。new但是在 try3 中,参数的类型不同,运行时无法确定关键字的最佳type选择。new

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

4

2 回答 2

3

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

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

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

或者,您可以转换其中一个或两个元素:

sampleElement.AddClassRange(new[] { (ClassBase<MyInterface>) arg1, arg2 });
于 2011-12-26T13:31:23.540 回答
2

做就是了:

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

事实上,在一个数组中不能有不同的对象类型。在您的情况下,您应该将它们转换为相同的对象类型,因为最后您ClassBase<MyInterface>的 SomeClass 中有一个类型的对象,因此您应该将其转换为ClassBase<MyInterface>. 在您的第一个示例中,此转换可以隐式完成,但在您的第二个示例中则不能。

于 2011-12-26T13:27:38.173 回答