2012-02-28 67 views
7

为什么我可以使用VBScript for each语句迭代System.Collections.ArrayList对象,但不是Systems.Collections.SortedList对象?在.Net COM中使IEnumerable有意义Interop

假定下列:

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。我只是问为什么IEnumrable似乎没有在互操作版本SortedList中实现,当它在ArrayList的互操作版本中实现时。

回答

3

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

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

我的猜测是,你可能想使用values属性,并且,如果你用数字排序,您要使用Add方法参数的其他方式即

sList.Add 1, "a"