C#,如何将派生类的列表传递给接收基类列表的方法



这是我的代码的简化版本:

using System.Collections.Generic;
public abstract class FruitBox<T>
{
public T item;
public static T ChooseFirst(List<FruitBox<T>> fruitBoxes)
{
return fruitBoxes[0].item;
}
}
public class Apple
{
}
public class AppleBox : FruitBox<Apple>
{
}
public class FruitShop
{
List<AppleBox> appleBoxes = new List<AppleBox>();
public void Main()
{
AppleBox appleBox = new AppleBox();
appleBoxes.Add(appleBox);
AppleBox.ChooseFirst(appleBoxes); // => Error here
}
}

我的线路有一个错误:

AppleBox.ChooseFirst(appleBoxes);

无法从System.Collections.Generic.List<AppleBox>转换为System.Collections.Generic.List<FruitBox<Apple>>

我尝试过:

AppleBox.ChooseFirst((List<FruitBox<Apple>>)appleBoxes);

但同样的错误。

我必须如何继续?

这里解释了这种行为的原因。简而言之,类不支持C#中的方差,并且List<AppleBox>不是List<FruitBox<Apple>>

你能做什么:

  • "转换";集合(实际创建一个新集合(:

使用OfType<>().ToList()

AppleBox.ChooseFirst(appleBoxes.OfType<FruitBox<Apple>>().ToList())

或仅ToList

AppleBox.ChooseFirst(appleBoxes.ToList<FruitBox<Apple>>())
  • 更改ChooseFirst签名以使用协变IEnumerable<out T>接口:
public abstract class FruitBox<T>
{
public T item;
public static T ChooseFirst(IEnumerable<FruitBox<T>> fruitBoxes)
{
return fruitBoxes.First().item;
}
}

您必须将派生类的引用保存到基类变量中

List<FruitBox<Apple>> appleBoxes = new List<AppleBox>();
FruitBox<Apple> appleBox = new AppleBox();
appleBoxes.Add(appleBox);
appleBox.ChooseFirst(appleBoxes);

最新更新