Нет, проблем нет, потому что метод 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)));