2017-04-04 16 views
1

私は2つのリストを持っています。
車と飛行機の両方を指すことができる参照「オブジェクト」を解除するにはどうすればよいですか?
Javaで知っているのはリスト<ですか?オブジェクト>オブジェクトを拡張し、それが
C#genericリストへの参照(JavaのList <?extendオブジェクト>と同じ)

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

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

これはバグの原因になります。 'objects.Add(new Tank());'はコンパイルして実行時エラーをスローします。 –

+0

共通インタフェースを定義し、このインタフェースでListを宣言します。 – ckruczek

答えて

0

はありませんC#で可能である、あなただけの別の型指定されたリストをキャストすることはできません。これは、List<object>が共変種ではないためです。 (あなたがリストをキャストした後にAdd("aaa")に電話をかけることができたら何が起きるか)

List<object>を使わずに最後のリストを別のものにするのが最も良い方法ですが、共通のインターフェースです。ジェネリック型パラメータだけでなく、リストのためにも。

IEnumerable<IVehicle> objects; 
objects = cars; 
objects = planes; 

その後CarPlaneは、そのインターフェイスを実装してみましょう。 .NET 4.5のことができますから、

+0

ええ、私の悪い。更新しました。 –

1

:あなたは、基本クラス/インタフェースを使用できるように

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

VehicleCarの基底クラスを持つ)

IReadOnlyList<T>は、(out TTで共変です実際のコレクションの要素の

明らかにすることができます:

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

はあなたが.Add() :-)ことはできませんが、あなたがvehicles.Countでき、インデクサvehicles[0]を使用し、...そしてそれが読み取りであるコレクションであることを覚えておいてくださいIReadOnlyList<>ビーイング、ないその要素、あなたはまだvehicles[0].BreakTheRearViewMirror()

0

あなたはそれを行うことができないことができますが、同様にキャストを使用して、最小限のコードで変換することができる唯一のよう:

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

もちろん、参照する代わりに新しいインスタンスを作成します。

関連する問題