Нет, проблем нет, потому что метод List<T>.Exists
выполняется с нетерпением. Следовательно, изменения в значении захваченной переменной немедленно «реагируются». У вас do есть измененное закрытие, но это не обязательно (как в этом случае) неправильно.
С другой стороны, если бы вы добавили «лямбду» (на самом деле делегат) в список внутри цикла, а затем запустили эти запросы, вы столкнулись бы с реальными проблемами с изменением-закрытием, которыми является 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)));