将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运行时是根据传递给它的参数来决定关键字new
的type
。但在try3中,参数类型不同,运行时无法为new
关键字确定最佳的type
。
谢谢。如果需要更多信息,请告诉我。
只有当数组元素的类型与其中一个元素的编译时类型完全一致时,隐式类型数组才有效。换句话说,编译器将元素类型集视为候选类型集,然后尝试找到所有其他类型都可以隐式转换为的类型中的一个。
在您的示例中,候选类型集是ClassAction1
和ClassAction2
,两者都不能隐式转换为另一个—这就是为什么您得到编译器错误。因此,您需要显式地声明所需的元素类型—假设是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>
。在第一个示例中,可以隐式地进行强制转换,但在第二个示例中则不能。