Невозможно преобразовать () общий элемент словаря в DictionaryEntry при перечислении через неуниверсальный IDictionary - PullRequest
4 голосов
/ 07 октября 2011

У меня есть некоторый код, который перебирает неуниверсальный 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, не прибегая к ручному построению списка?

1 Ответ

7 голосов
/ 07 октября 2011

Проблема в том, что реализация IEnumerable в Dictionary<TKey,TValue> перечисляет KeyValuePairs.Foreach в IDictionary будет использовать функцию IDictionary.GetEnumerator, которая возвращает IDictionaryEnumerator (внутренне это сообщает функции IEnumerator во внутреннем классе Enumerator, какой тип возвращать.) В то время как функция Cast работает с IEnumerable, что сделает еевернуть KeyValuePair.

Вы можете написать собственный метод Cast для решения этой проблемы, если вы действительно должны использовать неуниверсальный интерфейс и DictionaryEntry

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