2016-05-27 8 views
0

IEnumerableにインデックスを付けると、範囲外のインデックスを使用するとデフォルト値が返されることに気付きました。私はArgumentOutOfRangeExceptionを受け取ると予想されます。たとえば、このコードではlistItemが0になります。例外はスローされません。IEnumerableにインデックスを付けるときに使用する拡張方法

Dim list As IEnumerable = New List(Of Integer)({1, 2, 3}) 
Dim listItem As Integer = CInt(list(-1)) 

私はIListとしてキャストした場合、予想通り、私はArgumentOutOfRangeExceptionを取得します。

このコードは例外をスローします。

Dim list As IList = New List(Of Integer)({1, 2, 3}) 
Dim listItem As Integer = CInt(list(-1)) 

私がIEnumerableにインデックスを付けることはそれ自体が驚くべきことです。私はそれがLinq拡張を使用していると確信していますが、私は使用中であることがわかりません。この現象は、ElementAtOrDefaultメソッドが使用されていることを示していますが、これをサポートするためのドキュメントが見つかりません。

ここでは何が起こっていますか?実際にどの方法が使用されているかを知る良い方法はありますか?

+0

ここで、より正式な説明を見つけました[IList(Of Key)を実装していない場合でもKeyCollection/ValueCollectionの項目にインデックスでアクセスできるのはなぜですか?](http://stackoverflow.com/questions/36933428) /私がアクセスできる - アイテム内のキーコレクション - 値によるコレクション - インデックス - それが妥当かどうか) – sstan

答えて

1

あなたは正しいですか?コンパイラの魔法をやって、それをEnumerable.ElementAtOrDefaultの呼び出しに変換していると思われます。

VB.NETでコードをコンパイルし、逆コンパイラツールを使用してC#で同等のコードを確認して確認しました。

EDIT

私は仕様を参照してこの動作を説明することanother SO postを発見しました。重複としてマークされています。

関連する問題