Подтвердить что ты не робот

Почему происходит переполнение IDictionary <TKey, TValue> в IEnumerable <объект>?

См. следующий фрагмент кода:

(IEnumerable<object>)new Dictionary<string, string>()

Вышеприведенный бросок выдает недопустимое исключение литейной формы.

Собственно, IDictionary<TKey, TValue> также косвенно реализует IEnumerable<out T>, потому что он также реализует ICollection<T>. То есть вся акция должна быть действительной.

На самом деле для меня еще более странно, что если я запустил весь набор в слот для отладочного диска, он работает!

Введите описание изображения здесь

Что происходит?

4b9b3361

Ответ 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)