Beim Indexieren in eine IEnumerable
, habe ich festgestellt, dass die Verwendung eines Index außerhalb des Bereichs zu einem Standardwert zurückgegeben wird. Ich hätte erwartet, eine ArgumentOutOfRangeException
zu erhalten. Dieser Code führt beispielsweise dazu, dass listItem
0 ist. Es wird keine Ausnahme ausgelöst.Welche Erweiterungsmethode wird beim Indexieren in IEnumerable verwendet
Dim list As IEnumerable = New List(Of Integer)({1, 2, 3})
Dim listItem As Integer = CInt(list(-1))
Wenn ich als IList
werfen, erhalte ich die ArgumentOutOfRangeException
wie erwartet.
Dieser Code löst die Ausnahme aus.
Dim list As IList = New List(Of Integer)({1, 2, 3})
Dim listItem As Integer = CInt(list(-1))
Die Tatsache, dass ich kann Index in IEnumerable
in sie von sich selbst überraschend. Ich bin sicher, dass es Linq
Erweiterungen verwendet, aber ich kann nicht herausfinden, welche verwendet wird. Das Verhalten scheint darauf hinzuweisen, dass die Methode ElementAtOrDefault verwendet wird, aber ich kann keine Dokumentation finden, die dies unterstützt.
Was geht hier vor? Gibt es einen guten Weg herauszufinden, welche Methoden tatsächlich verwendet werden?
Ich fand nur die formellere Erklärung hier [Warum kann ich auf ein Element in KeyCollection/ValueCollection per Index zugreifen, auch wenn es IList (Of Key) nicht implementiert?] (Http://stackoverflow.com/questions/36933428/why-can-i-access-ein-item-in-keycollection-valuecollection-durch-index-even-wenn-es-tun – sstan