Осмысление IEnumerable в .Net COM Interop - PullRequest
7 голосов
/ 28 февраля 2012

Почему я могу использовать оператор VBScript for each для итерации объекта System.Collections.ArrayList, но не объекта Systems.Collections.SortedList?

Учитывая следующее:

set aList = Server.CreateObject("System.Collections.ArrayList")
aList.Add "a"
aList.Add "b"
aList.Add "c"
for each item in aList
    ' do something
next

set sList = Server.CreateObject("System.Collections.SortedList")
sList.Add "a", 1
sList.Add "b", 2
sList.Add "c", 3
for each item in sList
    ' do something
next

Линия

for each item in sList

падает с

объект не поддерживает это свойство или метод *.

По это свойство Я предполагаю, что они имеют в виду свойство _NewEnum. Но почему _NewEnum выставляется ArrayList, а не SortedList? Оба класса реализуют интерфейс IEnumberable, который после дизассемблирования mscorelib.dll представляется интерфейсом, отвечающим за реализацию свойства _NewEnum (dispId из -4).

Если кто-нибудь сможет пролить свет на различное поведение COM-взаимодействия этих похожих классов, я был бы очень признателен.

Я знаю, что могу использовать другие свойства, предоставляемые SortedList, для перебора коллекции. Я не спрашиваю, как перебрать SortedList. Я просто спрашиваю, почему IEnumrable не реализовано в версии взаимодействия SortedList, когда оно реализовано в версии взаимодействия ArrayList.

1 Ответ

3 голосов
/ 22 апреля 2012

Хотя SortedList действительно реализует IEnumerable, он имеет перегруженный метод GetEnumerator (), который возвращает IDictionaryEnumerator. Вы должны явно привести к IEnumerable, чтобы использовать перегрузку, возвращающую IEnumerator, которая может быть там, где ваша проблема.

Перечислитель по умолчанию не имеет того же поведения, что и ArrayList - он будет возвращать DictionaryEntry для каждого элемента, а не строк, которые вы могли ожидать.

Полагаю, вы, вероятно, захотите использовать вместо этого свойство Values ​​и что, если вы сортируете по числам, вы захотите использовать аргументы метода Add наоборот, т. Е.

sList.Add 1, "a"
...