当索引到IEnumerable
时,我注意到使用超出范围的索引将导致返回默认值。我原本希望得到ArgumentOutOfRangeException
。例如,此代码导致listItem
为0.不会抛出异常。
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 :(得分:1)
你是对的。它正在做一些编译魔术并将其转换为您怀疑的Enumerable.ElementAtOrDefault调用。
我通过在VB.NET中编译代码,然后使用反编译工具查看C#中的等效代码来确认。
修改强>
我刚发现another SO post通过引用规范来解释这种行为。标记为重复。