我正在尝试将元素从泛型类型(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.为什么?
如果你使用.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支持协方差仿制药.