2017-05-03 82 views
2

說我有兩個班,飛機和汽車,這無論是從車輛如何獲得的兩組對象,從一個普通類

public class Vehicle 
{ 
} 

public class Car : Vehicle 
{ 
} 

public class Plane : Vehicle 
{ 
} 

繼承繼承工會如何採取平面的列表,汽車列表並將它們合併成單個車輛列表?我嘗試以下,但對汽車說最好的過載已採取IEnumerable類型

List<Vehicle> vehicles = cars.Union(planes); 

的接收器是否有這樣做比使用兩個循環。選擇施放的所有對象的一個​​簡單的方法錯誤到車?

+1

小旁註:由於汽車不能成爲飛機,因此您可以使用'Concat'而不是'Union'(除非列表本身應該是'distinct') –

回答

5

您需要枚舉強制轉換爲公共基類型:

var vehicles = cars.Cast<Vehcile>().Union(planes); 

的bieng是Union的簽名理由如下:

Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) 

在代碼中,形式first編譯原因是TSourceCar,因此second有錯誤的類型; IEnumerable<Plane>而不是預期的IEnumerable<Car>

記住,在類型推斷,編譯器不會bactrack和嘗試別的東西,如果推斷出了問題,那就是,它不會做到以下幾點:

  1. firstIEnumerable<Car>,所以TSource可能是Car
  2. second不是IEnumerable<Car>,所以TSource不能是Car
  3. 是否有共同類型TSource以便IEnumerable<Car>IEnumerable<Plane>都可以隱式轉換爲IEnumerable<TSource>?是的,Vehicle,因此TSourceVehicle
相關問題