このコード スニペットは、ラムダ式で foreach ループの反復子変数を使用する場合の予期しない動作を示しています。実行時には、「Hi String」、「Hi Single」、および「Hi Int32」を出力する代わりに、3 つのメソッドすべてに対して「Hi Int32」を出力します。
この動作は次のような理由から発生します。ラムダ式とそのキャプチャされた変数の性質。ラムダ式がループ内で定義されると、ループ変数の値ではなく参照がキャプチャされます。その結果、ループの繰り返し全体で同じ変数を参照します。
提供されたコードでは、変数の型はラムダ式によってキャプチャされます。ただし、このコードでは、type への同じ参照がループのすべての反復で共有されるという事実が考慮されていません。その結果、各ラムダ式は最後の反復から type の値を取得することになり、予期しない出力が発生します。
この問題を解決して目的の目標を達成するには、次のことを確認する必要があります。各ラムダ式は型の一意の値を取得します。これを行うには、反復ごとに新しい変数を作成し、それに type の現在の値を割り当てます。
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
newType を使用すると、type のコピーが効果的に作成され、現在の反復からその値が取得されます。これにより、各ラムダ式が自身の type 値への一意の参照を持つことが保証され、正しい出力が得られます。
以上が私のラムダ式がループ変数の最後の値を取得するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。