Enumerable

时间:2019-07-11 20:42:17

标签: c# linq-to-entities reverse-engineering dnspy

我正在通过dnSpy反编译System.Core.dll(4.7.3429.0)来学习linq,并看到重复的“产量中断;”在某些情况下,像这样

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中滥用?

3 个答案:

答案 0 :(得分:3)

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

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

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

似乎更理智的表示。

对于您在yield break;上的问题,一旦第一个出现,迭代器就完成了。大多数IDE都可以将其后的所有代码标记为不可访问。

答案 1 :(得分:3)

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

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

(JustDecompile添加大括号)。

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

答案 2 :(得分:1)

两次yield break没有目的。某种程度上类似于连续两次return语句,其中之一将无法访问...

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