Rumah >pembangunan bahagian belakang >C++ >Mengapa C# Melemparkan Ralat 'Ambiguous Invocation' Apabila Menggunakan Kumpulan Kaedah tetapi Bukan Kaedah Tanpa Nama?
Ralat panggilan samar-samar pengkompil C#: kaedah tanpa nama dan kumpulan kaedah
C# menyediakan dua sintaks untuk memanggil fungsi: kaedah tanpa nama (atau sintaks lambda) dan kumpulan kaedah. Kekaburan mungkin timbul menggunakan sintaks kumpulan kaedah apabila fungsi mempunyai berbilang beban yang menerima jenis perwakilan yang berbeza.
Pertimbangkan contoh kod berikut:
<code class="language-csharp">class Program { public static void Main() { // 匿名方法(编译成功) Method(() => classWithSimpleMethods.GetString()); Method(() => classWithSimpleMethods.DoNothing()); // 使用显式转换的方法组(也编译成功) Method((Func<string>)classWithSimpleMethods.GetString); Method((Action)classWithSimpleMethods.DoNothing); // 方法组(错误:“歧义调用”) Method(classWithSimpleMethods.GetString); Method(classWithSimpleMethods.DoNothing); } public static void Method(Func<string> func) { /* 执行某些操作 */ } public static void Method(Action action) { /* 执行某些操作 */ } }</code>
Dalam contoh ini, fungsi Method
mempunyai dua lebihan beban, satu yang menerima Action
dan satu lagi yang menerima Func<string>
. Apabila fungsi dipanggil menggunakan kaedah tanpa nama atau hantaran eksplisit kepada jenis perwakilan yang betul, kod tersebut dikompil tanpa ralat. Walau bagaimanapun, apabila menggunakan sintaks kumpulan kaedah, pengkompil melaporkan ralat "panggilan samar-samar".
Memahami kekaburan
Spesifikasi bahasa C# menyatakan bahawa terdapat penukaran tersirat daripada kumpulan kaedah kepada jenis perwakilan yang serasi. Walau bagaimanapun, dalam kes ini, pengkompil menghadapi kekaburan kerana kumpulan kaedah classWithSimpleMethods.GetString
boleh ditukar secara tersirat kepada Func<string>
dan Action
.
Mengikut spesifikasi, resolusi beban lampau melibatkan pemilihan calon yang paling sesuai berdasarkan jenis hujah yang sepadan. Walaupun senarai parameter kaedah GetString
serasi dengan kedua-dua lebihan beban, pengkompil tidak dapat menentukan padanan terbaik kerana ia tidak mengambil kira jenis pulangan semasa resolusi beban lampau.
Menyelesaikan kekaburan
Untuk menyelesaikan kekaburan, anda boleh menggunakan hantaran eksplisit kepada jenis perwakilan yang betul, seperti yang ditunjukkan dalam contoh kod. Walau bagaimanapun, pendekatan ini boleh membosankan dan terdedah kepada kesilapan.
Nasib baik, dalam C# 7.3 dan kemudian, pengkompil telah bertambah baik untuk mengendalikan situasi ini. Calon lebihan kini disenaraikan berdasarkan keserasian dengan jenis perwakilan sasaran, menghapuskan keperluan untuk penukaran eksplisit dalam kes ini.
Atas ialah kandungan terperinci Mengapa C# Melemparkan Ralat 'Ambiguous Invocation' Apabila Menggunakan Kumpulan Kaedah tetapi Bukan Kaedah Tanpa Nama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!