我已经离开继承一段时间了,需要一点帮助。
我有一个抽象基类 Chief
.有两个继承类Ship
和 Vehicle
, 通过 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/