Нет, проблем нет, потому что метод List<T>.Exists
выполняется быстро. Следовательно, на изменения значения захваченной переменной немедленно «реагируют». У вас есть есть модифицированное закрытие, но это не обязательно (как в данном случае) неправильно.
С другой стороны, если вы добавите «лямбда» (на самом деле делегат) в список внутри цикла, а затем запустите эти запросы, вы столкнетесь с фактическими проблемами модифицированного закрытия, о которых Resharper предупреждает вас. .
Если вы хотите избавиться от предупреждения, вы можете сделать:
string reference;
do {
reference = GenerateNewReference();
var refCopy = reference;
} while (currentItems.Exists(i => i.Reference.Equals(refCopy));
Немного не по теме: если вам нужен необычный способ написания поиска (без каких-либо предупреждений о модифицированном закрытии), вы можете написать служебный метод, например:
public static IEnumerable<T> Generate(Func<T> func)
{
if(func == null)
throw new ArgumentNullException("func");
while(true)
yield return func();
}
А затем используйте его как:
var result = MyExtensions.Generate(GenerateNewReference)
.First(reference => !currentItems.Exists(i => i.Reference.Equals(reference)));
person
Ani
schedule
22.01.2011