Почему происходит переполнение IDictionary <TKey, TValue> в IEnumerable <объект>?
См. следующий фрагмент кода:
(IEnumerable<object>)new Dictionary<string, string>()
Вышеприведенный бросок выдает недопустимое исключение литейной формы.
Собственно, IDictionary<TKey, TValue>
также косвенно реализует IEnumerable<out T>
, потому что он также реализует ICollection<T>
. То есть вся акция должна быть действительной.
На самом деле для меня еще более странно, что если я запустил весь набор в слот для отладочного диска, он работает!
![Введите описание изображения здесь]()
Что происходит?
Ответы
Ответ 1
В этом словаре реализованы IEnumerable<KeyValuePair<TKey, TValue>>
и IEnumerable
, но IEnumerable
структуры не совпадает с IEnumerable
объекта. Отклонение работает только для ссылочных типов.
Это работает в моем конце и должно быть логичным выбором:
var x = (IEnumerable)new Dictionary<string, string>();
В качестве примера это работает:
List<string> l = new List<string>();
var x = (IEnumerable<object>)l;
Но этого нет:
List<DateTime> l2 = new List<DateTime>();
var x = (IEnumerable<object>)l2;
Ясно, что проблема заключается в структуре.
(Почему он работает в ваших окнах Watch, я не знаю)
Ответ 2
Я думаю, это потому, что KeyValuePair
- это тип значения.
Это не получится:
List<int> ints = new List<int>();
var objs = (IEnumerable<object>)ints;
Это будет работать:
List<string> ints = new List<string>();
var objs = (IEnumerable<object>)ints;
то же самое касается словаря.
Ответ 3
Если вы действительно не можете жить с простым IEnumerable
, попробуйте следующее:
new Dictionary<string, string>().Cast<object>();
Ответ 4
Это странно. Фрагмент кода отлично работает с .NET 4.0. Я предлагаю вам использовать IEnumerable
.
Читайте: Интерфейс IDictionary (MSDN)