C# – 当Dog是Animal的子类时,如何将List 转换为List ?

我有一个类Animal ,它的子类Dog 。 我有一个List ,我想将一些List的内容添加到List 。 有没有更好的方法,只需将List转换为List ,然后使用AddRange

如果您使用C#4,则不需要演员:

 List animals = new List(); List dogs = new List(); animals.AddRange(dogs); 

这是允许的,因为AddRange()接受一个IEnumerable ,它是协变的 。

但是,如果你没有C#4,那么你必须迭代List并投射每个项目,因为只是添加了协方差。 您可以通过.Cast扩展方法完成此操作:

 animals.AddRange(dogs.Cast()); 

如果你甚至没有C#3.5,那么你将不得不手动进行投射。

我相信这取决于您使用的.Net版本。 我可能会弄错,但在.Net 4中,我认为你可以做到

 animalList.AddRange(dogList); 

否则在.Net 3.5中,你可以这样做

 animalList.AddRange(dogList.Select(x => (Animal)x)); 

你可以使用Cast ()

 //You must have using System.Linq; List dogs = new List (); List animals = new List (); animals.AddRange (dogs.Cast ()); 

编辑:正如dlev指出的那样,如果你运行框架4,则不需要强制转换。