ここでは、2つの主要な概念が役割を果たす:Type ConversionsおよびGeneric Interfaces Varianceです。分散が先行する場合。
ケース1:List<T>
クラス定義では、汎用パラメータには差がありません。したがって、List<object>
とList<string>
の間に定義された関係はありません。彼らは不変です。したがって、暗黙的および明示的な両方の型変換は不可能です。
ケース2:
分散をList<T>
に許可されますが、IEnumerable<T>
のために許可されていない理由:List<T>
はそうList<string>
が暗黙のうちにIEnumerable<object>
DETAILSにキャストすることができ、共変ジェネリック型であるIEnumerable<out T>
を実装?
ジェネリックのポイントは、コンパイル時の安全性を提供することです。 List<T>
ので書き込み可能でないとコンパイル時のチェックがなかった場合、我々は次のように書いて、実行時エラーが発生している可能性があり:
List<string> stringList = new List<string>();
stringList.Add("some string"); // we are safe
List<object> objectList = stringList;
objectList.Add((new Object()); // Aargh!
// we are trying to put an object to a list of strings!
List<T>
ためだから、何の危険な分散。
ただし、IEnumerable<out T>
は読み取り専用です。参照されるインスタンスを変更する方法はありません。
IEnumerable<object> objectList = new List<string>();
// we can't add a string to the objectList,
// as `IEnumerable<out T>` is a read-only interface.
したがって、安全な分散が可能です。
共分散と反動を見てください。 – HimBromBeere
http://stackoverflow.com/questions/16966961/cannot-convert-from-listderivedclass-to-listbaseclassまたはhttp://stackoverflow.com/questions/1817300/convert-listderivedclass-to-listbaseclassを参照してください。 – wkl
s.th.をまだやりたいのであれば。 'List