2010-11-27 7 views
12

私はエラーを示しているLINQクエリを持っている:linqクエリで「変更されたクロージャへのアクセス」について心配すべきでしょうか?

alt text

コレクションのソースは、LINQクエリであれば、私は、このエラーに私は私が反復処理してい変数にアクセスしようとする任意の時間を参照してください。私はこのエラーは、変数が変わる可能性があること、あるいはそのようなものを私に伝えていると思いますか?

答えて

18

このエラーは、あなたがそれを定義し、それを保存するときに、クエリ内のpubConfigへの参照は、クエリがを評価された時点でpubConfigの値を使用することを通知されず、 pubConfigSettings

実際には、クエリが「現場で」評価されればOKです。後で評価するためにそれを保持し、その間にpubConfigの値が変更されると、予期しない結果が発生します。

9

considered harmfulというループ変数で終了しています。クエリは、変数を参照します。クエリが作成されたときの変数の値ではありません。特定のコード例で問題が発生するかどうかは明らかではありませんが(作成したクエリによって何が行われるかによって異なります)、一般的に問題をデバッグするのが難しくなるため避けてください。

単純な解決策は、ループ変数のコピーをクエリで参照する前に取得することです。

foreach (var pubConfig in ...) 
{ 
    var pubConfig2 = pubConfig; 
    // Use pubConfig2 instead of pubConfig in the query. 
} 
+0

コピーを作成するとエラーがクリアされます。それはちょうど多くの余分なコードのように思えます(あなたが何か有害なことをしていない場合)ヒントをありがとう! –

1

ラムダの存続期間中に変数が変更されない限り、問題はありません。

変数を変更してラムダを再度使用すると、ラムダは変数の新しい値を取得します。この値は、混乱したり、スレッドセーフではなくてもかまいません。

警告を取り除くには、変数を外側スコープからコピーしてラムダで使用することができます。

関連する問題