いいえ、List<T>.Exists
メソッドが熱心に実行されるため、問題はありません。したがって、キャプチャされた変数の値の変化はすぐに「応答」されます。 doには変更されたクロージャがありますが、必ずしも(この場合のように)間違っているとは限りません。
一方、 "lambda"(本当にデリゲート)をループ内のリストに追加してからこれらのクエリを実行すると、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)));
出典
2011-01-22 13:27:57
Ani