为什么我可以使用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}}。
答案 0 :(得分:3)
虽然SortedList确实实现了IEnumerable,但它有一个重载的GetEnumerator()方法,它返回IDictionaryEnumerator。您必须显式转换为IEnumerable以使用返回IEnumerator的重载,这可能是您的问题所在。
默认枚举器与ArrayList的行为不同 - 它将为每个项返回一个DictionaryEntry,而不是您可能期望的字符串。
我的猜测是你可能想要使用Values属性,如果你按数字排序,你想要反过来使用Add方法参数,即
sList.Add 1, "a"