Nat*_*lch 4 .net linq linq-to-objects dictionary casting
我有一些代码IDictionary通过首先调用LINQ Cast方法迭代非泛型.但是,在传递泛型字典实现时,我得到了无效的强制转换异常,即使我是通过非泛型IDictionary接口专门使用它.
IDictionary dict = new Dictionary<object, object> {{"test", "test"}};
foreach (var item in dict)
{
    Debug.Assert(item is DictionaryEntry); // works
}
dict.Cast<DictionaryEntry>().ToList();     // FAILS
当正常迭代没有时,为什么上面的Cast方法会失败?有没有一种可靠的方法可以将非通用字典转换为枚举DictionaryEntry而无需借助手动列表构建?
问题是枚举KeyValuePairs 的IEnumerable实现Dictionary<TKey,TValue>.Foreach on an IDictionary将使用IDictionary.GetEnumerator返回IDictionaryEnumerator 的函数(在内部,它告诉IEnumerator内部Enumerator类的函数返回哪个类型.)而Cast函数在IEnumerable上运行,这将使它返回KeyValuePair.
如果你真的必须使用非泛型接口和DictionaryEntry ,你可以编写自己的Cast方法来解决这个问题
IEnumerable<DictionaryEntry> CastDE(IDictionary dict) {
    foreach(var item in dict) yield return item;
}