理解.Net COM Interop中的IEnumerable

为什么可以使用VBScript for each语句来迭代System.Collections.ArrayList oject,但不是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属性。 但是为什么_NewEnumArrayList暴露,但不是SortedList ? 这两个类都实现了IEnumberable接口,该接口从反汇编mscorelib.dll看来是负责实现_NewEnum属性的接口( dispId为-4)。

如果任何人都可以看到这些类似类的不同COM互操作行为,我会非常感激。

我知道我可以使用SortedList公开的其他属性遍历集合。 我不问如何迭代SortedList 。 我只是问,为什么在互操作版本的ArrayList实现时, IEnumrable似乎没有在SortedList的互操作版本中实现。


尽管SortedList确实实现了IEnumerable,但它有一个重载的GetEnumerator()方法,该方法返回IDictionaryEnumerator。 您必须明确地将其转换为IEnumerable才能使用返回IEnumerator的重载,这可能是您的问题所在。

默认枚举器不具有与ArrayList相同的行为 - 它将为每个项目返回一个DictionaryEntry,而不是您可能期望的字符串。

我的猜测是你可能想要使用Values属性,而如果你按照数字排序,你想用另一种方法使用Add方法参数

sList.Add 1, "a"
链接地址: http://www.djcxy.com/p/10495.html

上一篇: Making sense of IEnumerable in .Net COM Interop

下一篇: DirectoryIterator::getBasename vs DirectoryIterator::getFilename