Rumah > pembangunan bahagian belakang > C++ > Mengapa C# Melemparkan Ralat 'Ambiguous Invocation' Apabila Menggunakan Kumpulan Kaedah tetapi Bukan Kaedah Tanpa Nama?

Mengapa C# Melemparkan Ralat 'Ambiguous Invocation' Apabila Menggunakan Kumpulan Kaedah tetapi Bukan Kaedah Tanpa Nama?

Susan Sarandon
Lepaskan: 2025-01-13 06:08:12
asal
500 orang telah melayarinya

Why Does C# Throw an

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

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!

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