我正在通过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中滥用?
答案 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
的目的是结束迭代器。