Проблема в:
e.Team.Where(partner => partner != member)
Переменная member
является прямой ссылкой на переменную member
во внешней области видимости. Хотя у вас может не быть проблем с этим в приведенном выше коде, это проблематично, если вы выполняете код в нескольких потоках или если вы не оцениваете лямбда-выражения в методе Where
сразу (например, при использовании IQueryable
вместо IEnumerable
).
Причина этой проблемы в том, что C # генерирует метод, который затем передается в качестве делегата Where
. Этот метод требует прямого доступа к memeber
. Если вы должны были присвоить ссылку на другую переменную, как это:
var m = member;
// ...
e.Team.Where(partner => partner != m);
Тогда C # может «захватить» это значение в конструкции, называемой «замыканием», и передать ее сгенерированному методу. Это гарантирует, что при изменении member
значение, которое вы ожидаете получить при передаче в Where
, не изменится.