我正在尝试将通用类型列表(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。为什么呢?
答案 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>