Я предполагаю, что SimpleRuleParser.GetRule
возвращает Dictionary<string, SimpleRule>
. Если вы хотите вернуть правила как перечисление KeyValuePairs
, то приведите значения к этому типу
return results.Rows.Cast<DataRow>().ToDictionary(
row => ToString(row["flag"]),
row => (IEnumerable<KeyValuePair<string, SimpleRule>>)SimpleRuleParser.GetRule(
ToString(row["rule"]))
);
Ошибка, которую вы получаете, заключается в том, что вы не можете разыграть
IEnumerable<KeyValuePair<string, Dictionary<string, SimpleRule>>>
до
IEnumerable<KeyValuePair<string, IEnumerable<KeyValuePair<string, SimpleRule>>>>
Приведение, которое я ввел для проанализированного значения, дает эффект
Dictionary<string, IEnumerable<KeyValuePair<string, SimpleRule>>>
, который реализует требуемый метод, возвращаемый тип
IEnumerable<KeyValuePair<string, IEnumerable<KeyValuePair<string, SimpleRule>>>>
Ваша проблема касается ковариации и контравариантности родовых типов. См. Также мой ответ на этот вопрос: C # 3.0 неявная ошибка приведения с классом и интерфейсами с универсальным типом
Примечание. Преимущество Dictionary<,>
состоит в том, что он обеспечивает очень быстрый доступ к значениям по клавише, в то время как IEnumerable<>
всегда должен быть перечислен, чтобы найти конкретную запись. Поэтому на самом деле может быть лучше вернуть результат через исходный тип Dictionary<string, Dictionary<string, SimpleRule>>
.