Доступ к измененному закрытию в лямбда-выражении - PullRequest
4 голосов
/ 08 февраля 2012
foreach(var category in categories) {
    a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category)));
}

Код работает нормально, но я получаю предупреждение о «доступе к измененному замыканию» в отношении category, используемого в лямбда-выражении.

Вопрос: Является ли предупреждение каких-либо последствий в этом случае?

Ответы [ 2 ]

6 голосов
/ 08 февраля 2012

Предупреждение здесь: доступ к переменной category внутри замыкания для лямбды Where.Значение category изменяется с каждой итерацией, а Where - задержка выполнения, следовательно, оно будет видеть текущее значение category в сравнении со значением во время создания лямбды.

В этом случае вы, вероятно, в порядке.Даже если Where является оценкой задержки, метод AddRange является быстрым и принудительно завершит оценку Where.Следовательно, метод Where увидит ожидаемое значение category.

Если вы хотите удалить предупреждение, просто объявите локальную копию переменной итерации и сохраните ее.

foreach(var category in categories) {
  var localCategory = category;
  a.AddRange(_db.Articles.Where(c => c.Categories.Contains(localCategory)));
}
0 голосов
/ 08 февраля 2012

Он говорит вам, что переменная "category" находится в замыкании и может быть изменена вне вашего выражения LINQ.

Посмотрите на вопрос здесь для некоторого объяснения.

...