3

これが C# で問題になるのはなぜですか?

public Dictionary<string, IEnumerable<object>> GetProducts() {
    return new Dictionary<string, IList<object>>();
}
4

2 に答える 2

3

IList<object>値として持っている辞書を作成するため、これは不可能です。

したがって、次のように呼び出すとします。

IEnumerable<object> values = someOtherObjectCollectionPerhapseSomethingFromLinq;
Dictionary<string, IEnumerable<object>> products = GetProducts();
products.Add("MyKey", values);

返される辞書はを受け入れますIEnumerable<object>が、下位の辞書はそれを受け入れません。これは、 type の値が HAVE TO BE でIList<object>あるためです。これはそうではありません。

于 2013-05-03T12:35:45.630 に答える
1

これを返すことはできません:

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>

元のコードではコンパイル時エラーが発生するため、このような問題が発生することはありません。

私自身、少し前に関連する質問をしました。これは、これをよりよく理解するのに役立つかもしれません.

于 2013-05-03T12:41:39.160 に答える