Rumah >pembangunan bahagian belakang >C++ >Mengapa Ungkapan Lambda Menangkap Nilai Akhir Pembolehubah Iterator dalam C#?

Mengapa Ungkapan Lambda Menangkap Nilai Akhir Pembolehubah Iterator dalam C#?

Barbara Streisand
Barbara Streisandasal
2024-10-29 11:02:02728semak imbas

Why Do Lambda Expressions Capture the Final Value of Iterator Variables in C#?

Menggunakan Ungkapan Lambda dengan Iterator dalam C#

Dalam C#, ungkapan lambda menyediakan cara yang ringkas dan mudah untuk mentakrifkan fungsi tanpa nama. Walau bagaimanapun, perangkap biasa apabila menggunakan ungkapan lambda dengan iterator ialah pembolehubah yang ditangkap bukanlah nilai semasa pembolehubah lelaran, sebaliknya nilai akhir.

Pertimbangkan kod berikut:

<code class="c#">Type[] types = new Type[] { typeof(string), typeof(float), typeof(int) };
List<PrintHelloType> helloMethods = new List<PrintHelloType>();

foreach (var type in types)
{
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
    helloMethods.Add(sayHello);
}

foreach (var helloMethod in helloMethods)
{
    Console.WriteLine(helloMethod("Hi"));
}</code>

Apabila anda melaksanakan kod ini, anda mungkin mengharapkan ia mencetak output berikut:

Hi String
Hi Single
Hi Int32

Walau bagaimanapun, output sebenar ialah:

Hi Int32
Hi Int32
Hi Int32

Ini kerana ungkapan lambda menangkap jenis pembolehubah gelung, bukan nilainya pada masa lambda ditakrifkan. Oleh itu, apabila lambda dilaksanakan, ia menggunakan nilai akhir jenis, iaitu Int32.

Untuk menyelesaikan isu ini dan mendapatkan output yang diingini, anda boleh menggunakan pembolehubah setempat untuk menangkap nilai semasa lelaran pembolehubah, seperti yang ditunjukkan dalam kod berikut:

<code class="c#">foreach (var type in types)
{
    var newType = type;
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
    helloMethods.Add(sayHello);
}</code>

Dalam kes ini, ungkapan lambda menangkap pembolehubah tempatan newType, yang diberikan nilai semasa jenis. Ini memastikan bahawa ungkapan lambda menggunakan nilai jenis yang betul apabila ia dilaksanakan.

Atas ialah kandungan terperinci Mengapa Ungkapan Lambda Menangkap Nilai Akhir Pembolehubah Iterator dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn