我正在通过dnSpy对System.Core.dll (4.7.3429.0)进行反编译来学习linq,并且在几种情况下看到重复的'yield;‘,就像这样
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?
发布于 2019-07-12 04:54:15
是啊,虫子。reference source和Telerik的JustDecompile都只显示
foreach (object obj in source) yield return (TResult)obj;(JustDecompile添加了大括号)。
这两条yield break语句都是冗余的。而且IEnumerator enumerator = null;也是一个多余的语句。
发布于 2019-07-12 04:53:58
这可能只是dnSpy反编译器胡乱猜测我认为是发布优化的代码。
另一个反编译器产生了以下结果:
private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
foreach (TResult result in source)
yield return result;
}这似乎是一种更合理的表达方式。
对于你在yield break;上的问题,一旦它达到第一个,迭代器就完成了。大多数IDE都可以将它后面的任何代码标记为不可访问。
发布于 2019-07-12 04:54:28
拥有两次yield break是没有意义的。这在某种程度上类似于在一行中有两条return语句,其中一条将是无法到达的……
yield break的目的是结束迭代器。
https://stackoverflow.com/questions/56997018
复制相似问题