Дублированный разрыв доходности в Enumerable - PullRequest
1 голос
/ 11 июля 2019

Я изучаю linq в процессе декомпиляции System.Core.dll (4.7.3429.0) с помощью dnSpy и вижу дублированный '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?

Ответы [ 3 ]

3 голосов
/ 11 июля 2019

Да, ошибка.И источник ссылки , и JustDecompile Telerik просто показывают

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

(JustDecompile добавляет фигурные скобки).

Оба yield break выражения являются избыточными.И IEnumerator enumerator = null; также является избыточным оператором.

3 голосов
/ 11 июля 2019

Вероятно, именно декомпилятор dnSpy делает дикие предположения о том, что я предполагаю, что это оптимизированный для выпуска код.

Другой декомпилятор дал следующее:

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

Что выглядит более вменяемым представлением.

На ваш вопрос по yield break;, как только он попадет в первый, итератор завершен.Большинство IDE могут пометить любой код, следующий за ним, как недоступный.

1 голос
/ 11 июля 2019

Нет смысла иметь yield break дважды.Это как-то похоже на наличие оператора return дважды подряд, один из них будет недоступен ...

Цель yield break - завершить итератор.

...