Поскольку primaryApps объявляется в контексте цикла for, primary не изменится, пока я обрабатываю primaryApps.Если бы я объявил primaryApps вне цикла for, то, безусловно, у меня есть проблемы с закрытием.Но почему в приведенном ниже коде?
Джаред прав;Чтобы продемонстрировать, почему ваш вывод не следует логически из вашей предпосылки, давайте создадим программу, которая объявляет primaryApps в контексте цикла for, и все еще страдает от проблемы с захваченной переменной цикла.Это достаточно просто сделать.
static class Extensions
{
public IEnumerable<int> Select(this IEnumerable<int> items, Func<int, bool> selector)
{
C.list.Add(selector);
return System.Enumerable.Select(items, selector);
}
}
class C
{
public static List<Func<int, bool>> list = new List<Func<int, bool>>();
public static void M()
{
int[] primaries = { 10, 20, 30};
int[] secondaries = { 11, 21, 30};
foreach (int primary in primaries)
{
var primaryApps = secondaries.Select(x => x == primary);
// do something with primaryApps
}
C.N();
}
public static void N()
{
Console.WriteLine(C.list[0](10)); // true or false?
}
}
Когда объявлено «primaryApps», это совершенно не имеет значения .Единственное, что имеет значение, это то, что замыкание может пережить цикл , и поэтому кто-то может вызвать его позже , неправильно ожидая, что переменная, захваченная в замыкании, была захвачена значением.
Resharper не может знать, что конкретная реализация Select не скрывает селектор на потом;на самом деле это именно то, что все они делают .Как Решарпер должен знать, что они случайно спрятали его в месте, которое не будет доступно позже?