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

时间:2014-06-02 20:14:04

标签: 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);
    }

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

2 个答案:

答案 0 :(得分:5)

如果您使用的是.NET 3.5,则可以使用Enumerable.Cast

repairables = new List<IRepairable>(modules.Cast<IRepairable>());

请注意,您的版本可以在C#4 / .NET 4及更高版本中运行,因为IEnumerable<T>变为IEnumerable<out T>,而C#4支持covariance in generics

答案 1 :(得分:0)

在添加协方差时,您在C#4.0之前使用的是C#版本。如果您切换到C#4.0+然后您可以利用协方差,特别是在这里,IEnumerable<T>将变为协变,允许您将IEnumerable<ShipModule>视为IEnumerable<IRepairable>。< / p>