如何将列表复制到具有不同但兼容的泛型类型的列表
本文关键字:列表 泛型类型 复制 | 更新日期: 2023-09-27 18:06:22
我试图将元素从泛型类型(ShipModule)的列表复制到另一个不同但兼容类型(IRepairable)的列表。
List<ShipModule> modules = new List<ShipModule>();
// Add some modules...
List<IRepairable> repairables;
repairables = new List<IRepairable>();
// This is an error:
repairables.AddRange(modules);
// So is this:
repairables = new List<IRepairable>(modules);
// This is okay:
foreach(ShipModule module in modules) {
repairables.Add(module);
}
ShipModule实现了IRepairable,所以可以安全地添加所有元素,但是我不能使用复制构造函数或AddRange。为什么?
如果你正在使用。net 3.5,你可以使用Enumerable。演员:
repairables = new List<IRepairable>(modules.Cast<IRepairable>());
请注意,您的版本在c# 4/中可以工作。. NET 4及以后版本,如IEnumerable<T>
变为IEnumerable<out T>
, c# 4支持泛型中的协方差。
您使用的是添加了协方差的c# 4.0之前的版本。如果您切换到c# 4.0+,那么您可以利用协方差,特别是在这里,IEnumerable<T>
将成为协变,允许您将IEnumerable<ShipModule>
视为IEnumerable<IRepairable>
。