ホームページ  >  記事  >  バックエンド開発  >  ラムダ式が foreach ループの各反復中の値ではなく、反復子変数の最終値を取得するのはなぜですか?

ラムダ式が foreach ループの各反復中の値ではなく、反復子変数の最終値を取得するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-31 08:43:02606ブラウズ

Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?

反復子変数を使用したラムダ式での予期しない動作

指定されたコードでは、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。