C#引用通用列表(等于列表<! - ?扩展对象 - >在Java中)

时间:2017-04-04 07:40:24

标签: c# generics

我有2个清单 如何判断可以指向汽​​车和飞机的参考“物体”? 我在Java中知道它是List&lt;?扩展对象&gt;对象,但在C#中是否可能

List<Car> cars = new List<Car>();
List<Plane> planes = new List<Plane>();

List<object> objects;
objects = cars;
objects = planes;

3 个答案:

答案 0 :(得分:1)

从.NET 4.5开始,您可以:

IReadOnlyList<Vehicle> vehicles = new List<Car>();

Vehicle基类为Car

IReadOnlyList<T>Tout 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;

然后让CarPlane实现该界面。

答案 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();

但当然,它会创建新实例而不是引用。