Возьмите код ниже, адаптированный из этот вопрос :
//Borrowed from another question because its a simpler example of what happened to me.
IEnumerable<char> query = "Not what you might expect";
foreach(char vowel in "aeiou")
{
query = query.Where(c => c != vowel);
}
foreach (char Output in query)
{
System.Out.WriteLine(Output);
}
Это только удаляет 'u' из коллекции символов запроса. Основная проблема связана с тем, что переменная c
в предложении Where
не оценивается до второго foreach. Мой вопрос:
1) Почему делегат, сгенерированный первым foreach, не захватил каждое значение c
, когда оно построено? Есть ли какая-то ситуация, о которой я не знаю, где это нежелательное поведение?
2) Если оно не захватывает значение c
, как это значение остается в области действия во втором элементе foreach, когда запрос фактически выполняется? Мне может показаться, что если не хранить значения передаваемых переменных, то попытка разрешить оператор для второго foreach потерпит неудачу, поскольку переменная c
явно находится вне области видимости.
Я не понимаю, почему «использовать последнее значение, которое мы видели для этой переменной назад, когда она находилась в области видимости», было хорошим конструктивным решением для этого обстоятельства, и я надеялся, что кто-то сможет пролить свет на эту тему.