Почему это проблема в C#?Возвращение подтипа IEnumerable в словаре не возможно
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
Почему это проблема в C#?Возвращение подтипа IEnumerable в словаре не возможно
public Dictionary<string, IEnumerable<object>> GetProducts() {
return new Dictionary<string, IList<object>>();
}
Это невозможно, потому что это Creata словарь, имеющий IList<object>
в качестве значения.
Так что, если вы могли бы назвать:
IEnumerable<object> values = someOtherObjectCollectionPerhapseSomethingFromLinq;
Dictionary<string, IEnumerable<object>> products = GetProducts();
products.Add("MyKey", values);
Ваш возвращение словарь примет IEnumerable<object>
но словарь underneat не будет принимать его, так как значения должны быть типа IList<object>
, что в этом есть, это ISN «т.
Вы не можете вернуть это:
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 не так давно, что может быть полезно для понимания этого лучше.
Jakob - просьба описать вашу проблему в будущем. Кажется, на этот раз на ваш вопрос был дан ответ, но подробное объяснение проблемы полезно тем, кто пытается ответить на ваш вопрос. – tnw