[英]Pass a List of a class into method with list of an abstract base class as a parameter
我有从类抽象基类继承的类,我想将任何这些类的List
传递给一个方法,该方法将基类的List
作为参数。 我怎么能做到这一点?
这是希望我尝试过 -
public abstract class MyBaseClass {}
public class MyClass1 : MyBaseClass {}
//Inside another class
public void MyMethod(List<MyBaseClass> listOfBaseClass){}
//Inside another class
List<MyClass1> myClass1List = new List<MyClass1>();
MyMethod(myClass1List); //ERROR HERE, This method call does not compile
反正有没有完成我想要做的事情?
如果要传递MyBaseClass
派生类型的MyBaseClass
,则需要更改签名
public void MyMethod(List<MyBaseClass> listOfBaseClass){}
对于支持协方差的类型,例如IEnumerable
或IReadOnlyCollection
,例如:
public void MyMethod(IEnumerable<MyBaseClass> listOfBaseClass){}
这是因为List
是不变的,而IEnumerable
是协变的。 编译器严格的原因是因为List
允许更改集合,例如,如果允许MyMethod
执行此操作:
public void MyMethod(List<MyBaseClass> listOfBaseClass)
{
listOfBaseClass.Add(new AnotherClass());
}
凡AnotherClass
是另一个子MyBaseClass
,它会break
来电者的集合,其应该是的List<MyClass1>()
;
更多关于这里
使用IReadOnlyList<T>
类型的参数声明您的方法。
您无法接收List<T>
或IList<T>
因为它们不是只读的。 如果你可以通过一个List<MyClass1>
参数转换为一个方法IList<MyBaseClass>
参数,该方法可以尝试添加MyClass2
对象到列表中(假设MyClass2
是另一继承MyBaseClass
)。 从方法的角度来看,它会没问题,但它会导致运行时失败 - 所以C#语言会立即阻止它。
如果您使用只读列表,您的问题将得到解决。 例如,类型为IReadOnlyList<MyBaseClass>
参数将接受List<MyClass1>
类型的参数 - 因为List<T>
实现IReadOnlyList<T>
,而IReadOnlyList<T>
T
声明为out
。
通过这种方式,您不必使用IEnumerable<T>
,也不会丢失索引的计数和随机访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.