Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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中#_C#_List_Generics - Fatal编程技术网

C# 如何定义采用列表的方法<;基地>;并列出<;派生>;在C中#

C# 如何定义采用列表的方法<;基地>;并列出<;派生>;在C中#,c#,list,generics,C#,List,Generics,我有以下方法 List<List<Animal>> animalsList = new List<List<Animal>>(); public void AddAnimal(List<Animal> animals) { animalsList.Add(animals); } List animalsList=new List(); 公共动物(列出动物) { 动物列表。添加(动物); } 如何将此方法用于列表 我试过了 p

我有以下方法

List<List<Animal>> animalsList = new List<List<Animal>>();

public void AddAnimal(List<Animal> animals)
{
   animalsList.Add(animals);
}
List animalsList=new List();
公共动物(列出动物)
{
动物列表。添加(动物);
}
如何将此方法用于
列表

我试过了

public void AddAnimal<T>(List<T> animals) where T: Animal
{
   animalsList.Add(animals);
}
public void AddAnimal(列出动物),其中T:Animal
{
动物列表。添加(动物);
}
那也不行。有没有办法定义这种方法?
我会使用
IEnumerable
,但我需要将
.Add()
.Clear()
等方法反映到内部列表中,而无需显式执行。

这里需要的是协方差,C在泛型类上不支持协方差,但在泛型接口上支持协方差。此外,它不是协变的,而是协变的

您可以将参数更改为接受一个
IEnumerable
,然后强制转换为方法中的列表,这样您就可以将
动物的派生类型集合传递给该方法。

请尝试以下操作:

        public void AddAnimal<T>(List<T> animals) where T : Animal
        {
            animalsList.Add(animals.Cast<Animal>().ToList());
        }
public void AddAnimal(列出动物),其中T:Animal
{
添加(animalsList().ToList());
}

看起来
Animal
应该是一个界面。请参阅下面的帖子:@ozgur,因为如果
Dog
实现了该界面,您可以轻松地执行
animallist.Add(listOfDogs)后一个例子加上一个.Cast将修复它?@Sam创建一个新列表。如果我使用IEnumerable,那么我无法强制api用户将列表作为参数。我说的对吗?你不能在编译时强制执行,但是如果他们传入一个你不想使用的类型,你可以进行类型检查并抛出一个异常。有点脏,但它让你更接近你的意图。@ozgur:如果你看一下你的原始代码,你就会明白为什么
IList
不能协变。如果您使用
列表
,您可能会将任意动物添加到您的狗列表中。之后会发生坏事。数组是协变的(由于历史原因,可以追溯到前泛型时代),它们的协变是框架中的主要类型安全漏洞。简单集合(
IEnumerable
)可以是协变的,因为它们只能被读取,不能被更改。@Flydog57你完全正确。我想,因为你说的,我想要的似乎不合理。但是,只有在少数情况下,能够做到这一点是无价的。