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
的目的是结束迭代器。
我正在通过 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
的目的是结束迭代器。