Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建类型的通用列表的变通方法<;超类>;并用派生类填充它?_C#_Generics_Inheritance - Fatal编程技术网

C# 创建类型的通用列表的变通方法<;超类>;并用派生类填充它?

C# 创建类型的通用列表的变通方法<;超类>;并用派生类填充它?,c#,generics,inheritance,C#,Generics,Inheritance,我想制作一个列表,并将派生类添加到此列表中 我在这里看到,通过.NET中的设计,这是不可能的: 那么,解决这一问题的最佳做法是什么?我想我可以将我的派生类装箱,使它们看起来像我的超类,但这感觉有点笨拙。我想我应该以不同的方式设计我的课程……但是如何设计呢?如果我理解你想做什么,你应该可以做得很好 List<SuperClass> myList = new List<SuperClass>(); SubClass item1 = new SubClass(); Super

我想制作一个列表,并将派生类添加到此列表中

我在这里看到,通过.NET中的设计,这是不可能的:


那么,解决这一问题的最佳做法是什么?我想我可以将我的派生类装箱,使它们看起来像我的超类,但这感觉有点笨拙。我想我应该以不同的方式设计我的课程……但是如何设计呢?

如果我理解你想做什么,你应该可以做得很好

List<SuperClass> myList = new List<SuperClass>();

SubClass item1 = new SubClass();
SuperClass item2 = new SuperClass();

myList.add(item1);
myList.add(item2);
List myList=new List();
子类item1=新的子类();
超类item2=新的超类();
添加(第1项);
myList.add(第2项);

这是有效的代码,然后您可以轻松地从列表中检索元素,并使用多态性的基本规则相应地更改对象的类型。

这样做很好。虽然您不知道列表中项目的确切类型(不强制转换),但将派生类型添加到基类型集合中不会有问题

本文链接的是您尝试使用派生类型集合作为基类型集合的情况:

void DisplayFruit(List<Fruit> fruit)
{
    fruit.ForEach(f => Console.WriteLine(f.ToString()));
}

List<Apples> apples = new List<Apples>();
// add apples here

DisplayFruit(apples); //Error!
无效显示水果(列出水果)
{
fruit.ForEach(f=>Console.WriteLine(f.ToString());
}
列出苹果=新列表();
//在这里加苹果
水果(苹果)//错误!
如果苹果被声明为一个
列表
,那么它就可以工作了。

as,这应该可以正常工作。人们在这方面看到的唯一常见限制是列表作为方法参数的协方差——即,他们发现不能将
列表
传递给接受
列表的方法

public void Foo<T>(IList<T> list) where T : Animal {...}
....
List<Dog> dogs = ...
Foo(dogs); // implicit <Dog>