1

私のコードは次のようなものです:

Dictionary<string, string> specialCharacters = new Dictionary<string, string>();
            specialCharacters.Add("@", "%");
            specialCharacters.Add("*", "^");

List<Action<Employee>> listOfDel = new List<Action<Employee>>();

foreach (KeyValuePair<string, string> character in specialCharacters)

{

Action<Employee> replace = (empData) => empData.EmpName =          empData.EmpName.ToString().Replace(character.Key, character.Value);

listOfDel.Add(replace);

//listOfDel.Add(new Action<Employee>((empData) => empData.EmpName = empData.EmpName.ToString().Replace(character.Key, character.Value)));

}     

問題は、リスト listOfDel が同じアクションを参照していることです。これは、最後の character.Key, character.Value ((" ", "^") のペアの値を取る同じ関数 replace を参照するため、リスト内で異なるアクションを持つ結果が必要ですof actions listOfDel , where each method will have different value present. ("@", "%"), (" ", "^"); また、アクション デリゲートの新しいインスタンスを作成し、それを匿名メソッドとして使用してみました。コメント付きのコードを参照してください。問題は解決されていません。

4

1 に答える 1

0

問題は、反復子変数をキャプチャしていることです。ループによって宣言される変数は1 つだけなので、デリゲートを実行するまでには、すべて同じ値が使用されます (すべて同じデリゲートを参照します)。C# 4 以前の場合は、コピーを作成するだけです。foreach

foreach (KeyValuePair<string, string> character in specialCharacters)  
{
    var copy = character;
    Action<Employee> replace = empData => empData.EmpName =    
         empData.EmpName.ToString().Replace(copy.Key, copy.Value);

    listOfDel.Add(replace);    
}

foreachC# 5 では、無名関数に関する限り、各反復が個別の変数を持つように修正されるため、これは不要になります。

詳細については、Eric Lippert のブログ記事「有害と見なされるループ変数をクローズする」を参照してください。

于 2012-06-03T16:01:52.933 に答える