Решарпер излишне предупреждает меня о доступе к измененному закрытию здесь? - PullRequest
2 голосов
/ 07 октября 2011

... поэтому у меня есть этот код:

        foreach (var entry in list)
        {
            var marginOneEntry = otherList.FirstOrDefault(p => p.Margin == entry.Margin);                
            if (marginOneEntry == null) continue;
            // Do stuff with marginOneEntry
        }

и Resharper 5.1 предупреждает меня о «доступе к измененному замыканию» для использования entry в операторе сравнения в лямбда-выражении.Разве вызов FirstOrDefault не отменяет эту проблему?Является ли мой код плохим или это предупреждение является просто недостатком в Resharper?

Примечание: я читал другие темы по Доступу к измененному закрытию здесь на SO, но я хочу получить ответ для этого конкретного случая и получить разъяснениядействительно ли Решарпер слишком чувствителен к этому вопросу.

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Да, это проблема в Resharper, поскольку он не различает методы с ленивым вычисленным результатом от методов, которые не используют данную лямбду в ленивых вычислениях. FirstOrDefault не выполняет ленивую оценку (забыл термин, противоположный 'ленивому'), поэтому его безопасно использовать в вашем примере, но обычно нет способа понять это по сигнатуре метода.

3 голосов
/ 07 октября 2011

Я думаю, что вы допустили ошибку в коде выше. Ваше предварительное условие .Where(p => entry.Margin == 1) не включает перечисляемый элемент. Вы имели в виду p.Margin == 1 вместо?

Кроме того, вместо записи x.Where(y).FirstOrDefault() вы можете просто написать x.FirstOrDefault(y).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...