假设我有两个类,Plane和Car,它们都继承自Vehicle
public class Vehicle
{
}
public class Car : Vehicle
{
}
public class Plane : Vehicle
{
}
如何获取飞机列表和汽车列表并将它们合并到一个车辆列表中?我尝试了下面这个,但是在汽车上有一个错误,说最好的重载必须采用IEnumerable类型的接收器
List<Vehicle> vehicles = cars.Union(planes);
有没有比使用两个.Select循环更简单的方法来将所有对象强制转换为Vehicle?
答案 0 :(得分:5)
您需要将枚举强制转换为公共基类型:
var vehicles = cars.Cast<Vehcile>().Union(planes);
Union
签名的原因如下:
Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
在您的代码中,表单first
,编译器会推断TSource
为Car
,因此second
的类型错误; IEnumerable<Plane>
代替预期的IEnumerable<Car>
。
请记住,在类型推断中,如果推理出错,编译器将不会进行bactrack并尝试其他操作,也就是说,它不会执行以下操作:
first
为IEnumerable<Car>
,因此TSource
可以 Car
。second
不是IEnumerable<Car>
,因此TSource
不能是Car
。TSource
,以便IEnumerable<Car>
和IEnumerable<Plane>
可以隐式转换为IEnumerable<TSource>
?是的,Vehicle
,因此TSource
是Vehicle
。