これが C# で問題になるのはなぜですか?
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
これが C# で問題になるのはなぜですか?
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
IList<object>
値として持っている辞書を作成するため、これは不可能です。
したがって、次のように呼び出すとします。
IEnumerable<object> values = someOtherObjectCollectionPerhapseSomethingFromLinq;
Dictionary<string, IEnumerable<object>> products = GetProducts();
products.Add("MyKey", values);
返される辞書はを受け入れますIEnumerable<object>
が、下位の辞書はそれを受け入れません。これは、 type の値が HAVE TO BE でIList<object>
あるためです。これはそうではありません。
これを返すことはできません:
new Dictionary<string, IList<object>>();
..しかし、これを返すことができます:
new Dictionary<string, IEnumerable<object>>();
.. または戻り値の型を変更します。
public Dictionary<string, IList<object>> GetProducts(){ ... }
この背後にある理由の一部:
返されたディクショナリを として取得できるがDictionary<string, IEnumerable<object>>
、値がList<object>
ではなくIEnumerable<object>
(List
は のより具体的なタイプIEnumerable
) であると想像してください。
その後、新しい要素を追加しようとするとIEnumerable<object>
、実際には要素のタイプIEnumerable<object>
が ではなく であるため、無効な操作になりますList<object>
。
許可されない理由はList<object>
、 type の要素に、 が含まないメソッドが含まれる可能性がある (実際に含まれている)IEnumerable<object>
ためです。
type の要素を に追加することを想像してIEnumerable<object>
くださいDictionary<string, List<object>>
。つまり、メソッドが定義されていない最初の要素に到達するまでList<object>
、各要素で固有のメソッドを呼び出すことができ、そのため例外がスローされる可能性があります。IEnumerable<object>
元のコードではコンパイル時エラーが発生するため、このような問題が発生することはありません。
私自身、少し前に関連する質問をしました。これは、これをよりよく理解するのに役立つかもしれません.