Rumah >pembangunan bahagian belakang >C++ >Mengapakah Sintaks Kumpulan Kaedah Menyebabkan Ralat 'Invokasi Ambiguous' dengan Perwakilan Terlebih Sarat (Tindakan lwn. Fungsi)?
Sintaks Kumpulan Kaedah dan Seruan Samar-samar dengan Lebihan Perwakilan
Menggunakan sintaks kumpulan kaedah dan bukannya ungkapan lambda boleh membawa kepada kekaburan apabila berurusan dengan kaedah terlebih beban menerima Action
atau Func<string>
perwakilan. Walaupun ungkapan lambda berfungsi dengan lancar, kumpulan kaedah mencetuskan ralat "Ambiguous invocation".
Keperluan untuk Casting Eksplisit: Memahami Peraturan Penukaran
Punca utama terletak pada kumpulan kaedah C# untuk mewakilkan peraturan penukaran. Kumpulan kaedah secara tersirat menukar kepada jenis perwakilan serasi, bermakna jenis parameter dan pengubah suai mesti sepadan. Yang penting, jenis pulangan tidak dipertimbangkan semasa penukaran tersirat ini.
Semasa resolusi beban lampau, pengkompil mencari kaedah yang berkenaan. Kaedah boleh digunakan jika parameternya boleh ditukar secara tersirat daripada argumen yang disediakan. Dalam senario ini, classWithSimpleMethods.GetString()
terpakai kepada kedua-dua Func<string>
dan Action
kerana senarai parameter kosong. Pengkompil tidak boleh memilih antara penukaran yang sama sah ini, oleh itu ralat kekaburan. Menghantar kumpulan kaedah secara eksplisit ke sama ada Action
atau Func<string>
menyelesaikan masalah ini.
C# 7.3 dan Seterusnya: Penyelesaian Sarat Lebih Baik
Seperti yang dinyatakan oleh Jon Skeet, C# 7.3 memperkenalkan penambahbaikan pada resolusi beban yang berlebihan, mengurangkan kekaburan ini. Dalam banyak keadaan, penghantaran eksplisit tidak lagi diperlukan dengan C# 7.3 dan versi yang lebih baru.
Atas ialah kandungan terperinci Mengapakah Sintaks Kumpulan Kaedah Menyebabkan Ralat 'Invokasi Ambiguous' dengan Perwakilan Terlebih Sarat (Tindakan lwn. Fungsi)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!