2012-02-28 13 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では公開されていませんか?どちらのクラスも、mscorelib.dllを分解して_NewEnumプロパティ(dispId--4)の実装を担当するインターフェイスのように見えるIEnumberableインターフェイスを実装しています。

誰かがこれらの類似したクラスのさまざまなCOM相互運用動作についていくらか光を当てることができれば、私は非常に感謝しています。

SortedListによって公開されている他のプロパティを使用してコレクションを反復することができます。私はSortedListを反復する方法を尋ねていません。私はちょうどIEnumrableArrayListの相互運用バージョンで実装されている場合、SortedListのinteropバージョンで実装されていないように尋ねています。

答えて

3

SortedListはIEnumerableを実装していますが、IDictionaryEnumeratorを返すオーバーロードされたGetEnumerator()メソッドがあります。問題がある場所にあるかもしれないIEnumeratorを返すオーバーロードを使用するには、明示的にIEnumerableにキャストする必要があります。

デフォルトの列挙子は、ArrayListと同じ動作をしません。期待する文字列ではなく、各項目のDictionaryEntryが返されます。

私の推測では、あなたはおそらく、あなたが数字でソートしている場合は、代わりにValuesプロパティを使用し、そのしたいことでしょう、あなたはAddメソッドの引数に、すなわち

sList.Add 1, "a" 
の周りに他の方法を使用したいです
関連する問題