これら2つのクラスがある場合:
class A {}
class B : A {}
List<A> を作成しますが、List<A>.AddRange(List<B>) を呼び出して List<B> を追加したいのですが、コンパイラは拒否します。
Argument '1': cannot convert from 'System.Collections.Generic.List<A>'
to 'System.Collections.Generic.IEnumerable<B>
IEnumerable<B> は IEnumerable<A> から継承されないため、私は完全に理解しています。そのジェネリック型には継承があります。
私の解決策は、 List<A>.Add(A item) が B 項目で機能するため、 List<B> を列挙して項目を個別に追加することです。
foreach(B item in listOfBItems)
{
listOfAItems.Add(item);
}
ただし、私が欲しいのは AddRange だけなので、それはかなり非表現的です。
私は使用できます
List<B>.ConvertAll<A>(delegate(B item) {return (A)item;});
しかし、それは不必要に複雑で、間違った呼び方です。
質問: 自分自身のリストのようなコレクションを作成する場合、B のコレクションを A のコレクションに List<A>.AddRange(List <B>)であり、最大限の型安全性を保持します。(そして最大で、引数がコレクションと型の継承チェックの両方であることを意味します。)