我有一些迭代非泛型的代码IDictionary http://msdn.microsoft.com/en-us/library/system.collections.idictionary.aspx首先调用 LINQCast http://msdn.microsoft.com/en-us/library/bb341406.aspx方法。但是,在传递通用字典实现时,我收到无效的强制转换异常,即使我专门通过非通用字典使用它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
不诉诸手动列表构建?
问题是IEnumerable
实施于Dictionary<TKey,TValue>
枚举键值对。 Foreach 上IDictionary
将使用IDictionary.GetEnumerator
返回一个 IDictionaryEnumerator 的函数(在内部,这告诉IEnumerator
函数对内部 Enumerator 类返回哪种类型。)而 Cast 函数对 IEnumerable 进行操作,这将使其返回 KeyValuePair。
你可以编写自己的 Cast 方法来解决这个问题,如果你真的must使用非泛型接口和DictionaryEntry
IEnumerable<DictionaryEntry> CastDE(IDictionary dict) {
foreach(DictionaryEntry item in dict)
yield return item;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)