首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Enumerable中出现重复的收益率中断

在Enumerable中出现重复的收益率中断
EN

Stack Overflow用户
提问于 2019-07-12 04:42:17
回答 3查看 79关注 0票数 1

我正在通过dnSpy对System.Core.dll (4.7.3429.0)进行反编译来学习linq,并且在几种情况下看到重复的'yield;‘,就像这样

代码语言:javascript
复制
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中的missusing?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-12 04:54:15

是啊,虫子。reference source和Telerik的JustDecompile都只显示

代码语言:javascript
复制
foreach (object obj in source) yield return (TResult)obj;

(JustDecompile添加了大括号)。

这两条yield break语句都是冗余的。而且IEnumerator enumerator = null;也是一个多余的语句。

票数 3
EN

Stack Overflow用户

发布于 2019-07-12 04:53:58

这可能只是dnSpy反编译器胡乱猜测我认为是发布优化的代码。

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

代码语言:javascript
复制
private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
  foreach (TResult result in source)
    yield return result;
}

这似乎是一种更合理的表达方式。

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

票数 3
EN

Stack Overflow用户

发布于 2019-07-12 04:54:28

拥有两次yield break是没有意义的。这在某种程度上类似于在一行中有两条return语句,其中一条将是无法到达的……

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56997018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档