如何将列表复制到具有不同但兼容的泛型类型的列表

本文关键字:列表 泛型类型 复制 | 更新日期: 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>