我有一段代码,它会抛出错误:
无法隐式转换类型' System.Collections.Generic.Dictionary>'至 '&System.Collections.Generic.Dictionary GT;'
我希望编译器理解IEnumerable
和List
是兼容的但是会抛出错误。请解释为什么会这样?
Dictionary<string, List<DataRow>> sampleData = new Dictionary<string, List<DataRow>>();
Dictionary<string, IEnumerable<DataRow>> schedules = sampleData;
谢谢!
答案 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);
}