反復子変数を使用したラムダ式での予期しない動作
指定されたコードでは、myClass.Execute() を呼び出したときに予期される出力は "Hi String」、「Hi Single」、「Hi Int32」。ただし、コードは「Hi Int32」を 3 回出力します。この予期しない動作はなぜ発生しますか?また、どのように修正できますか?
問題は、foreach ループ内で使用されるラムダ式にあります:
var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
このコードでは、ループ変数の型は次のとおりです。ラムダ式で捉えます。ただし、キャプチャされるのは、特定の反復での type の値ではなく、変数自体への参照です。
したがって、後で PrintHelloType デリゲートが呼び出されるとき、最後に type の値が使用されます。ループ、つまり「Int32」です。これにより、予期しない出力が発生します。
解決策:
目的の目標を達成するには、新しい変数を使用して各反復中に type の値を取得できます。
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
各ラムダ式は、特定の反復の正しい値である newType の値を取得します。予想される出力「Hi String」、「Hi Single」、「Hi Int32」が生成されます。
以上がラムダ式が foreach ループの各反復中の値ではなく、反復子変数の最終値を取得するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。