Re[2]: IEnumerable в Hashtable
От: Аноним  
Дата: 26.12.05 15:45
Оценка:
Здравствуйте, scif, Вы писали:

S>Здравствуйте, Аноним, Вы писали:

А>>
А>>Hashtable ht = Hashtable.Synchronized(new Hashtable());
А>>ht.Add(1,1);
А>>ICollection col = (ICollection)ht;
А>>foreach(object de in col)
А>>   Console.WriteLine(de.ToString());
А>>

S>
S>Вобщем то и нет ничего удивительно, ведь интерфейс ICollection НЕ ПРЕДОСТАВЛЯЕТ
S>индексного доступа к елементам коллекции, поскольку не смотря на свое обманчивое имя
S>содержит только базовые свойства и методы для всех коллекций.
S>И даже то, что он наследует IEnumerable не дает ему желаемых возможностей, поскольку
S>IEnumerable содержит всего 1 метод GetEnumerator, который, правда, сможет Вам помочь.
S>Но это уже совсем другая история...

Если посмотреть в ildasm, то можно увидеть что

IL_0020:  callvirt   instance class [mscorlib]System.Collections.IEnumerator [mscorlib]System.Collections.IEnumerable::GetEnumerator()
...
IL_0029:  callvirt   instance object [mscorlib]System.Collections.IEnumerator::get_Current()


т.е. ICollectoin использует IEnumerable для получение IEnumerator. А вот IEnumerator::get_Current() возвращает ошибку

    Current    <error: an exception of type: {System.InvalidOperationException} occurred>    System.Object


хотя col.Counter = 1.

Такое впечатление что Hashtable этот интерфейс не реализовывает. Если так то зачем его было наследовать ???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.