2013-05-03 3 views
3

Почему это проблема в C#?Возвращение подтипа IEnumerable в словаре не возможно

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

Jakob - просьба описать вашу проблему в будущем. Кажется, на этот раз на ваш вопрос был дан ответ, но подробное объяснение проблемы полезно тем, кто пытается ответить на ваш вопрос. – tnw

ответ

3

Это невозможно, потому что это Creata словарь, имеющий IList<object> в качестве значения.

Так что, если вы могли бы назвать:

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

Ваш возвращение словарь примет IEnumerable<object> но словарь underneat не будет принимать его, так как значения должны быть типа IList<object>, что в этом есть, это ISN «т.

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> мощи (и делает) содержать методы, что IEnumerable<object> не делает.

Представьте, что вы добавляете элемент типа IEnumerable<object> в Dictionary<string, List<object>>. Это означало бы, что вы могли бы назвать List<object> -специальный метод для каждого элемента до, вы достигли первого IEnumerable<object> -элемента, где этот метод не будет определен, и для этого выведите исключение.

Ваш исходный код вызывает ошибку времени компиляции, чтобы остановить вас от таких проблем, как это.

Я сам спросил related question не так давно, что может быть полезно для понимания этого лучше.

Смежные вопросы