IEnumerable<T> 包装器的 GetEnumerator() 的替代实现

Alternative Implementation of GetEnumerator() for IEnumerable<T> Wrapper

我正在以与通常相同的方式为 IEnumerable<T> 实现包装器 class,我注意到 ReSharper 建议我转换 [=15= 中的 foreach 循环] 方法到 LINQ 表达式。

出于好奇,我点击了 "Convert into LINQ-expression",然后将我的方法更改为:

public IEnumerator<T> GetEnumerator()
{
    foreach (var item in _someList)
    {
        yield return item;
    }
}

进入 ReSharper 的 "LINQ-expression" 结果:

public IEnumerator<T> GetEnumerator()
{
    return ((IEnumerable<T>) _someList).GetEnumerator();
}


代码非常简单:不是在那里循环 _someList,而是将 _someList 转换为 IEnumerable<T>,然后使用任何现有的 GetEnumerator() 方法 return 同样的结果。

我以前没见过这个实现,我想知道在您确实没有任何自定义项可放入枚举器的情况下使用它是否有任何危险。我还想知道使用一种实现比使用另一种实现是否有任何好处。

如果您的非通用 GetEnumerator 已经完美运行(除了非通用),那么没有理由 使用它。在这种情况下,您只想转换为 IEnumerable<T>.

如果没有,那么您将需要自己使用 yield 语句,正如您已经知道的那样。