繁体   English   中英

将类的List传递给方法,并将抽象基类的列表作为参数

[英]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){}

对于支持协方差的类型,例如IEnumerableIReadOnlyCollection ,例如:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM