とサブクラスのコレクションを追加します> .AddRange(一覧<B>)コンパイラは拒否する:はAddRange
Argument '1': cannot convert from 'System.Collections.Generic.List<A>'
to 'System.Collections.Generic.IEnumerable<B>
私は完全に理解しているIEnumerableを<理由B >はIEnumerable < A>を継承しません。その汎用型には継承があります。一覧< > .Add(アイテム)がB項目で動作しますので、
私のソリューションは、リスト<B>を列挙し、個別の項目を追加することです:
foreach(B item in listOfBItems)
{
listOfAItems.Add(item);
}
はしかし、それはむしろ非表情豊かだから私が欲しいのはちょうどAddRangeです。
私は
List<B>.ConvertAll<A>(delegate(B item) {return (A)item;});
を使用することができますが、それは不必要に複雑だと私は変換していないよので誤った名称は、私がキャスティングです。
質問:私は私がリストにワンライナー同類としてののコレクションにBさんのコレクションをコピーできるようになり、私はそれに追加するどのような方法で自分のリストのようなコレクションを記述した場合<A> .AddRange(リスト<B >)およびは、最大の型安全性を保持します。 (そして最大限私は引数がコレクション型継承チェックの両方であることを意味します)。
"引数が列挙できない場合や、型の継承がうまくいかない場合は失敗します。"という推論から利益を得ることができます。それは少なくとも私にとっては期待される行動です。あなたは何を期待していますか、またはこれはどのように問題になりますか? – Lucero
それはまさに私が疑うところです。私はこれが最大の型安全性に関する私の質問の要求を満たすと言っていました。 –
コンパイラは型が互換性があることをコンパイラが知っているので(「編集」で追加したかどうかわからない)、「item」から「T」へのキャストは不要です。 – Lucero