我有2个清单 如何判断可以指向汽车和飞机的参考“物体”? 我在Java中知道它是List<?扩展对象>对象,但在C#中是否可能
List<Car> cars = new List<Car>();
List<Plane> planes = new List<Plane>();
List<object> objects;
objects = cars;
objects = planes;
答案 0 :(得分:1)
从.NET 4.5开始,您可以:
IReadOnlyList<Vehicle> vehicles = new List<Car>();
(Vehicle
基类为Car
)
IReadOnlyList<T>
在T
(out T
)中是协变的,因此您可以使用真实集合元素的基类/接口。
显然你可以:
IReadOnlyList<object> vehicles = new List<Car>();
成为IReadOnlyList<>
你不能.Add()
:-)但你可以vehicles.Count
,使用索引器vehicles[0]
,...并记住它是集合这是只读的,而不是其元素,所以你仍然可以vehicles[0].BreakTheRearViewMirror()
答案 1 :(得分:0)
不,您不能将一个类型列表转换为另一个。这是因为List<object>
不是共变体。 (想象一下,如果你能够在列出名单后调用Add("aaa")
会发生什么......)
您拥有的最佳选择是不使用List<object>
,而是使用通用界面,使最后一个列表变为共变体。不仅是泛型类型参数,也是列表。
IEnumerable<IVehicle> objects;
objects = cars;
objects = planes;
然后让Car
和Plane
实现该界面。
答案 2 :(得分:0)
您不能这样做,但您可以使用Cast转换为最少的代码:
List<Car> cars = new List<Car>();
List<Plane> planes = new List<Plane>();
List<object> objects;
objects = cars.Cast<object>().ToList();
objects = planes.Cast<object>().ToList();
但当然,它会创建新实例而不是引用。