Является ли Resharper излишне предупреждающим меня о доступе к измененному закрытию здесь?

#linq #resharper

#linq #resharper

Вопрос:

… итак, у меня есть этот код:

         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 в операторе сравнения в лямбда-выражении. Разве первый вызов по умолчанию не устраняет эту проблему? Мой код плохой или это предупреждение просто недостаток в Resharper?

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

Ответ №1:

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

Комментарии:

1. Термин, противоположный ленивому, был бы нетерпеливым.

Ответ №2:

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

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

Комментарии:

1. Что касается FirstOrDefault: Спасибо, я это изменил. Но я имел в виду доступ к переменной записи в предложении Where . Вот почему Resharper реагирует. Однако теперь я изменил фрагмент кода, чтобы он был более реалистичным. Предположим, у нас есть два списка с одинаковыми объектами — list и otherlist