c# - 如何将 List<Child> 传递给带有参数 List<Parent> 的方法?

标签 c# .net c#-4.0 generics inheritance

我已经离开继承一段时间了,需要一点帮助。

我有一个抽象基类 Chief .有两个继承类ShipVehicle , 通过 Chief 共享多个属性.

我有一个使用这些通用属性的方法:

public static void AssignRandomProperties(PSetList routeSettings, List<Chief> theChiefs)

但是当我尝试传递一个

List<Ship> 

或一个

List<Vehicle> 

我被告知它们无法转换。这是一个示例方法调用:

ChiefRouteRandomizer.AssignRandomProperties(s.Route, theVehicles);

我当然假设 List<Vehicle>将被视为 List<Chief>当作为参数传递给 AssignRandomProperties 时,但显然不是。列表是否需要转换为 List<Chief>第一的?如果是,怎么办?

最佳答案

先解释一下。您无法转换 List<Vehicle>List<Chief>因为 Add 方法将具有签名 void List<Chief>.Add(Chief item)你将能够存储 Chief 的实例声明为仅包含 Vehicle 的列表中的类秒。这会破坏类型系统;因此这是不允许的。

解决此问题的最简单方法是传入 theVehicles.ToList<Chief>() .但是,这将创建一个新列表。这有两个含义:(1) 复制列表会浪费内存,(2) 如果该方法要改变列表本身(添加/删除项目或用其他成员替换成员),您将看不到这些更改在 theVehicles 上列表。 (如果列表中引用指向的对象是唯一被修改的对象,这不是问题。)

如果您可以控制 AssignRandomProperties 方法,请考虑改用此签名:

public static void AssignRandomProperties<T>(
    PSetList routeSettings,
    IList<T> theChiefs) where T : Chief
{
    ...
}

关于c# - 如何将 List<Child> 传递给带有参数 List<Parent> 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481878/

相关文章:

c# - 如何使用收缩、toArray 和 fromArray 方法改进 System.Tuple

c# - 将 byte[] 转换为图像 Windows Phone

c# - 尝试编写一个令人愉快的解析器

c# - HttpWebResponse.LastModified 的默认值

c#-4.0 - 使用 DynamicObject (IDynamicMetaObjectProvider) 作为静态类型的组件会导致死循环

c# - 编写依赖注入(inject)的库 "enabled"

.net - 什么是 webclient 以及 webclient 在 .net 中的用途

c# - String.Equals vs String.Compare vs "=="实战。需要解释

.net - 使用 C# 中的高级矩阵库计算 C# 中的特征向量。网

c# - 使用 C# 4.0 避免过载 hell