索引到IEnumerable时使用哪种扩展方法

时间:2016-05-27 20:06:51

标签: vb.net linq .net-4.5

当索引到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方法,但我找不到任何支持此方法的文档。

这里发生了什么?有没有一种很好的方法来确定实际使用哪些方法?

1 个答案:

答案 0 :(得分:1)

你是对的。它正在做一些编译魔术并将其转换为您怀疑的Enumerable.ElementAtOrDefault调用。

我通过在VB.NET中编译代码,然后使用反编译工具查看C#中的等效代码来确认。

修改

我刚发现another SO post通过引用规范来解释这种行为。标记为重复。