无法CAST()通用字典项的DictionaryEntry时,通过非一般的IDictionary枚举字典、非一般、CAST、IDictionary

2023-09-06 05:36:02 作者:柔情女王o( ̄3 ̄)o

我有一些code,它遍历一个非一般的 的IDictionary 通过先调用LINQ的 铸造 方法。路过即使我专门通过非泛型的IDictionary 接口,使​​用它的通用字典实现时,但我得到一个无效的转换异常。

I have some code that iterates over a non-generic IDictionary by first calling the LINQ Cast method. However I get an invalid cast exception when passing a generic dictionary implementation even though I'm specifically using it via the non-generic IDictionary interface.

IDictionary dict = new Dictionary<object, object> {{"test", "test"}};
foreach (var item in dict)
{
    Debug.Assert(item is DictionaryEntry); // works
}
dict.Cast<DictionaryEntry>().ToList();     // FAILS

为什么铸造法时,正常的循环没有上面的失败?有没有一种可靠的方法来转换非通用词典到的DictionaryEntry 枚举而不诉诸人工列表建设?

Why does the Cast method above fail when the normal iteration doesn't? Is there a reliable way to transform a non-generic dictionary into an enumeration of DictionaryEntry without resorting to manual list building?

推荐答案

问题是,在词典和其中的的IEnumerable 实施; TKEY的,TValue&GT; 列举KeyValuePairs。的foreach上的IDictionary 将使用 IDictionary.GetEnumerator 函数返回一个IDictionaryEnumerator(在内部,这告诉的IEnumerator 在内部枚举类返回哪种类型的功能。)鉴于演员函数操作的IEnumerable,这将使其返回一个KeyValuePair。

The problem is that the IEnumerable implementation on Dictionary<TKey,TValue> enumerates KeyValuePairs. Foreach on an IDictionary will use the IDictionary.GetEnumerator function which returns an IDictionaryEnumerator (internally, this tells the IEnumerator function on the internal Enumerator class which type to return.) Whereas the Cast function operates on IEnumerable, which will make it return a KeyValuePair.

您可以编写自己的角色的方法来解决这个问题,如果你真的的必须的使用非通用接口和的DictionaryEntry

You could write your own Cast method to work around this, if you really must use the non-generic interface and DictionaryEntry

IEnumerable<DictionaryEntry> CastDE(IDictionary dict) {
    foreach(var item in dict) yield return item;
}