Ralat panggilan samar-samar pengkompil C#: kumpulan kaedah dan jenis perwakilan
Dalam C#, apabila memanggil fungsi dengan banyak beban menggunakan sintaks kumpulan kaedah, pengkompil mungkin menghadapi ralat "panggilan samar-samar". Ralat ini berlaku kerana pengkompil tidak dapat menentukan beban lampau yang perlu dipanggil apabila terdapat dua kumpulan kaedah dengan jenis perwakilan yang serasi.
Pertimbangkan contoh kod berikut:
<code class="language-csharp">public class ClassWithDelegateMethods { public void Method(Func<string> func) { /* do something */ } public void Method(Action action) { /* do something */ } } public class ClassWithSimpleMethods { public string GetString() { return ""; } public void DoNothing() { } } public class Program { public static void Main(string[] args) { // 错误:歧义调用 ClassWithDelegateMethods classWithDelegateMethods = new ClassWithDelegateMethods(); classWithDelegateMethods.Method(classWithSimpleMethods.GetString); // 这里会报错 classWithDelegateMethods.Method(classWithSimpleMethods.DoNothing); // 这里会报错 } }</code>
ClassWithDelegateMethods.Method
boleh dipanggil menggunakan kaedah tanpa nama atau ungkapan lambda tanpa sebarang masalah. Walau bagaimanapun, panggilan classWithSimpleMethods.GetString
atau classWithSimpleMethods.DoNothing
menggunakan sintaks kumpulan kaedah mengakibatkan ralat kekaburan.
Sebab ralat ini terletak pada peraturan penukaran tersirat antara kumpulan kaedah dan jenis perwakilan. Menurut spesifikasi C#, terdapat penukaran tersirat antara kumpulan kaedah kepada jenis perwakilan yang serasi. Walau bagaimanapun, untuk kumpulan kaedah dengan lebihan beban, spesifikasi tidak mentakrifkan mekanisme untuk menentukan beban lampau yang hendak ditukar.
Elakkan ralat samar-samar
Untuk menyelesaikan ralat kekaburan, kumpulan kaedah boleh dihantar secara eksplisit kepada jenis perwakilan yang diperlukan. Contohnya:
<code class="language-csharp">// 无错误 classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString); classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);</code>
Sebagai alternatif, bermula dengan C# 7.3, algoritma pemilihan calon beban berlebihan pengkompil menghapuskan masalah ini. Oleh itu, dalam C# 7.3 dan ke atas, contoh kod di atas harus disusun tanpa penukaran yang jelas.
Atas ialah kandungan terperinci Mengapa C# Melemparkan Ralat 'Ambiguous Invocation' Apabila Menggunakan Kumpulan Kaedah dengan Kaedah Perwakilan Terlebih Beban?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!