IList <Type>到IList <BaseType>

Kyl*_*yle 9 .net c# inheritance

我有几节课:

class Vehicle
{
}

class Car : Vehicle
{
}
Run Code Online (Sandbox Code Playgroud)

我有一个派生类的列表: IList<Car> cars;

我想将列表转换为其基类,并尝试过: IList<Vehicle> baseList = cars as IList<Vehicle>;

但我总是得到null.也

cars is IList<Vehicle> evaluates to be false.
Run Code Online (Sandbox Code Playgroud)

当然,如果我执行以下操作,我可以将项目添加到列表中:

List<Vehicle> test = new List<Vehicle> ();

foreach ( Car car in cars )
{
   test.Add(car);
}
Run Code Online (Sandbox Code Playgroud)

我得到了我的清单,但我知道必须有更好的方法.有什么想法吗?

Lee*_*Lee 20

使用IEnumerable <T>.Cast:

IList<Vehicle> vehicles = cars.Cast<Vehicle>().ToList();
Run Code Online (Sandbox Code Playgroud)

或者,您可以避免转换为List,具体取决于您希望如何处理源汽车列表.

  • 请注意,这会产生一个新列表,而不是对同一列表的引用. (5认同)

Phi*_*ler 11

那种多态性,让你投IList<Car>IList<Vehicle>是不安全的,因为它会让你插入Truck你的IList<Car>.

  • 呃,不.他试图从派生类型的(引用到)列表中分配(引用a)基类型列表,并想知道为什么他得到null.如果他试图建立一个新的实例,这将工作正常. (5认同)