【问题标题】:Which extension method is used when indexing into IEnumerable [duplicate]索引到 IEnumerable 时使用哪种扩展方法 [重复]
【发布时间】:2016-05-27 20:06:51
【问题描述】:

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

这里发生了什么?有什么好的方法可以确定实际使用了哪些方法?

【问题讨论】:

标签: vb.net linq .net-4.5


【解决方案1】:

你是对的。正如您所怀疑的,它正在执行一些编译器魔法并将其转换为对Enumerable.ElementAtOrDefault 的调用。

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

编辑

我刚刚找到another SO post,它通过引用规范来解释这种行为。标记为重复。

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 2019-03-17
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多