Enumerable 中的重复收益率中断

Duplicated yield break in Enumerable

我正在通过 dnSpy 反编译 System.Core.dll (4.7.3429.0) 来学习 linq,在一些情况下看到重复的 'yield break;',比如这个

private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
    {
        foreach (object obj in source)
        {
            yield return (TResult)((object)obj);
        }
        IEnumerator enumerator = null;
        yield break;
        yield break;
    }

第二个永远不会被调用吗?

目的是什么? 它是 dnSpy 中的包还是 .NET 中的误用?

这可能只是 dnSpy 反编译器对我假设的发布优化代码进行了疯狂猜测。

另一个反编译器产生了以下内容:

private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
  foreach (TResult result in source)
    yield return result;
}

这似乎是一个更理智的表现。

关于 yield break; 上的问题,一旦它到达第一个,迭代器就完成了。大多数 IDE 可以将其后的任何代码标记为无法访问。

是的,错误。 reference source 和 Telerik 的 JustDecompile 都只显示

foreach (object obj in source) yield return (TResult)obj;

(JustDecompile 添加大括号)。

两个yield break语句都是多余的。 IEnumerator enumerator = null; 也是多余的语句。

两次 yield break 没有任何意义。这有点类似于连续两次 return 语句,其中一个将无法访问...

yield break的目的是结束迭代器。