将ICollection作为参数传递

本文关键字:参数传递 ICollection | 更新日期: 2023-09-27 18:18:45

我被这个简单的代码困住了一个多小时了…我几乎没有课……和这样的方法:

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

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

将ICollection作为参数传递

只有当数组元素的类型与其中一个元素的编译时类型完全一致时,隐式类型数组才有效。换句话说,编译器将元素类型集视为候选类型集,然后尝试找到所有其他类型都可以隐式转换为的类型中的一个。

在您的示例中,候选类型集是ClassAction1ClassAction2,两者都不能隐式转换为另一个—这就是为什么您得到编译器错误。因此,您需要显式地声明所需的元素类型—假设是ClassBase<MyInterface>:

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

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

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

just do:

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

实际上,在一个数组中不能有不同的对象类型。您应该将它们转换为相同的对象类型,因为最后您在SomeClass中有一个类型为ClassBase<MyInterface>的对象,因此您应该将其转换为ClassBase<MyInterface>。在第一个示例中,可以隐式地进行强制转换,但在第二个示例中则不能。