C#Dictionary键/值Ienumerable类型与Array / List不兼容

时间:2016-09-08 14:04:46

标签: c#

我有一段代码,它会抛出错误:

  

无法隐式转换类型' System.Collections.Generic.Dictionary>'至    '&System.Collections.Generic.Dictionary GT;'

我希望编译器理解IEnumerableList是兼容的但是会抛出错误。请解释为什么会这样?

Dictionary<string, List<DataRow>> sampleData = new Dictionary<string, List<DataRow>>();
                Dictionary<string, IEnumerable<DataRow>> schedules = sampleData;

谢谢!

2 个答案:

答案 0 :(得分:2)

问题是Dictionary不是协变的,因此您不能将较少派生的类型用于其通用参数。

假设您的代码已编译 - 那么您可以这样做:

Dictionary<string, List<DataRow>> sampleData = 
    new Dictionary<string, List<DataRow>>();

Dictionary<string, IEnumerable<DataRow>> schedules = sampleData;

schedules["KeyOne"] = new DaraRow[] {null};   
// should fail since an array is not a list, and the object type requires a list.

答案 1 :(得分:1)

解决方法可能是

Dictionary<string, IEnumerable<DataRow>> schedules = 
       sampleData.ToEnumerableDic();

使用通用扩展

public static Dictionary<T1, IEnumerable<T2>> ToEnumerableDic<T1,T2>(this Dictionary<T1, List<T2>> sampleData) {
    return sampleData.Select(x => new { a = x.Key, b = x.Value.AsEnumerable() })
        .ToDictionary(x => x.a, x => x.b);
}