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

jus*_*vin 3 c# generics

我正在尝试将元素从泛型类型(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);
    }
Run Code Online (Sandbox Code Playgroud)

ShipModule实现了IRepairable,因此可以安全地添加所有元素,但我不能使用复制构造函数或AddRange.为什么?

Ree*_*sey 5

如果你使用.NET 3.5,你可以使用Enumerable.Cast:

repairables = new List<IRepairable>(modules.Cast<IRepairable>());
Run Code Online (Sandbox Code Playgroud)

请注意,您的版本做的工作在C#4/.NET 4和更高版本,IEnumerable<T>成了IEnumerable<out T>和C#4支持协方差仿制药.