3

タイプのジェネリックリストをそのインターフェイスのジェネリックリストに設定するにはどうすればよいですか?

Carから継承するクラスがありICarます。

コンストラクターでオブジェクトをClient受け入れるクラスがあります。クラスに対して明示的に記述しList<ICar>たくありません。List<Car>Client

しかし、設定することはできません

var carsList = new List<Car>();
List<ICar> cars = carsList // compile error
var client = new Client(cars);

これをどのように達成しますか?

IListにすると機能することに気づきましたが、carsListオブジェクトを明示的にキャストする必要があります。

4

5 に答える 5

2

.NET Frameworkリストを使用して、必要な種類の暗黙的な変換を実行することはできなくなります。

基本的な問題を示すために、別のスレッドから何かを盗みます。

検討:

List<Animal> animals = new List<Giraffe>();
animals.Add(new Monkey());

または、コードを使用します。

interface ICar{}
class Car:ICar{}
class BatMobile:ICar{}

List<ICar> cars = new List<Car>()
cars.Add(new BatMobile()) // We can't add a BatMobile to a List of Car. 

IEnumerableは、ユーザーがIEnumerableインターフェースを介してコレクションを変更できないようにするため、このタイプの差異に問題はありません。リストでは、これを保証することはできません。

https://stackoverflow.com/a/2033931/299408

于 2013-01-03T17:22:10.530 に答える
1

を直接キャストすることはできませんList<Car>。これは、非表示のにList<ICar>を追加しようとする可能性があり、それが機能しないためです。OtherCarList<ICar>List<Car>

代わりに、次のことができます。

  • コンストラクターパラメーターを、などの共変インターフェイスにしIEnumerable<Car>、コンストラクター内でリストを作成するか、または
  • を介してコンストラクターの外部でリストを変換しますList<ICar> cars = carsList.ToList<ICar>();
于 2013-01-03T17:11:44.370 に答える
1

3つの方法があります。

1) define carsList as List<ICar>
2) use framework 4.0 and IEnumerable<ICar>
3) manually convert
于 2013-01-03T17:11:54.497 に答える
0

リストをICarのリストとして定義します...

var carsList = new List<ICar>();
List<ICar> cars = carsList; // compile error gone :)
于 2013-01-03T17:09:20.383 に答える
0

あなたはそれを逆にしなければなりません。

var carsList = new List<ICar>(); // Hey, why not?
var client = new Client(cars);

キャストしてみましたか?

List<ICar> carsList = (List<ICar>)implementationList;
于 2013-01-03T17:11:16.847 に答える