2016-05-27 4 views
0

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?

+0

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

Antwort

1

Sie haben Recht. Es tut etwas Compilermagie und wandelt das in einen Anruf zu Enumerable.ElementAtOrDefault um, wie Sie vermuteten.

Ich habe bestätigt, indem Sie Ihren Code in VB.NET kompiliert und dann ein Decompiler-Tool verwendet, um den entsprechenden Code in C# zu sehen.

EDIT

Ich habe gerade another SO post, die dieses Verhalten mit Bezug auf die Spezifikation erklärt. Als Duplikat gekennzeichnet.