1

我正在通过 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 中的误用?

4

3 回答 3

3

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

另一个反编译器产生以下结果:

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

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

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

于 2019-07-11T20:53:57.570 回答
3

是的,虫子。参考源和 Telerik 的 JustDecompile 都简单地显示

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

(JustDecompile 添加大括号)。

这两种yield break说法都是多余的。并且IEnumerator enumerator = null;也是一个多余的陈述。

于 2019-07-11T20:54:15.440 回答
1

yield break两次是没有目的的。这有点类似于return连续两次声明,其中一个将无法访问......

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

于 2019-07-11T20:54:28.350 回答