Rumah > pembangunan bahagian belakang > C++ > Mengapa C# Melemparkan Ralat 'Ambiguous Invocation' Apabila Menggunakan Kumpulan Kaedah dengan Kaedah Perwakilan Terlebih Beban?

Mengapa C# Melemparkan Ralat 'Ambiguous Invocation' Apabila Menggunakan Kumpulan Kaedah dengan Kaedah Perwakilan Terlebih Beban?

Patricia Arquette
Lepaskan: 2025-01-13 10:35:43
asal
466 orang telah melayarinya

Why Does C# Throw an

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>
Salin selepas log masuk
Kedua-dua lebihan

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan