Проблема в том, что вы полагаетесь на неуниверсальный интерфейс IEnumerator
, который не раскрывает реальный тип элемента (его свойство Current
имеет тип object
).Вместо этого используйте универсальный интерфейс (IEnumerator<T>
, который делает тип элемента легко обнаруживаемым), и все будет в порядке.
Конечно, вам не нужно никаких особых усилийза это.Класс Dictionary<,>
реализует интерфейс IEnumerable
явно .Его «неявный» метод GetEnumerator
возвращает перечислитель со строгой типизацией (вложенный тип, реализующий универсальный интерфейс), чего мы и хотим.
Так что можно использовать неявную типизацию полностью икомпилятор разбирается.
// Actually a Dictionary<string, cAsso>.Enumerator
// which in turn is an IEnumerator<KeyValuePair<string, cAsso>>
using(var iterdico = mDico.GetEnumerator())
{
while (iterdico.MoveNext())
{
// var = KeyValuePair<string, cAsso>
var kvp = iterdico.Current;
// var = string
var key = kvp.Key;
// var = cAsso
var value = kvp.Value;
...
}
}
РЕДАКТИРОВАТЬ:
Несколько других периферийных точек:
- В общем, вы должны
Dispose
перечислителей, как правило,с блоком using
. - Использование метода
Reset
на счетчиках не рекомендуется.На самом деле, в данном конкретном случае это бесполезно. - Обратите внимание, что тип элемента перечислителя - это ключ-значение пара , а не само значение.если вас интересуют только значения, перечислите последовательность, возвращаемую свойством
Value
словаря. - Как указывает Давиде Пирас, в большинстве случаев вам просто нужен обычный цикл
foreach
вместо вознис счетчиком самостоятельно.