Gelagat Tidak Dijangka dalam Ungkapan Lambda Menggunakan Pembolehubah Iterator
Dalam kod yang diberikan, output yang dijangkakan apabila memanggil myClass.Execute() ialah "Hai String", "Hi Single", "Hi Int32." Walau bagaimanapun, kod tersebut mencetak "Hi Int32" tiga kali. Mengapakah tingkah laku yang tidak dijangka ini berlaku dan bagaimanakah ia boleh dibetulkan?
Isunya terletak pada ungkapan lambda yang digunakan dalam gelung foreach:
var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
Dalam kod ini, jenis pembolehubah gelung ialah ditangkap oleh ungkapan lambda. Walau bagaimanapun, apa yang ditangkap bukanlah nilai jenis pada lelaran tertentu, tetapi rujukan kepada pembolehubah itu sendiri.
Oleh itu, apabila perwakilan PrintHelloType dipanggil kemudian, ia menggunakan nilai jenis pada akhir gelung, iaitu "Int32." Ini menghasilkan output yang tidak dijangka.
Penyelesaian:
Untuk mencapai matlamat yang diingini, pembolehubah baharu boleh digunakan untuk menangkap nilai jenis semasa setiap lelaran:
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
Kini setiap ungkapan lambda menangkap nilai newType, iaitu nilai yang betul untuk lelaran tertentu. Output yang dijangkakan kemudiannya dihasilkan: "Hi String", "Hi Single", "Hi Int32."
Atas ialah kandungan terperinci Mengapakah ungkapan lambda menangkap nilai akhir pembolehubah lelaran dan bukannya nilainya semasa setiap lelaran dalam gelung foreach?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!