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
Patricia Arquetteasal
2025-01-13 10:35:43520semak imbas

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>
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>

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!

Kenyataan:
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