Rumah >pembangunan bahagian belakang >C++ >Mengapakah Sintaks Kumpulan Kaedah Menyebabkan Ralat Seruan Samar-samar dengan Lebihan Perwakilan?

Mengapakah Sintaks Kumpulan Kaedah Menyebabkan Ralat Seruan Samar-samar dengan Lebihan Perwakilan?

Linda Hamilton
Linda Hamiltonasal
2025-01-13 10:10:43794semak imbas

Why Method Group Syntax Causes Ambiguous Invocation Errors (C# Delegate Overloads)

Ralat panggilan samar-samar yang disebabkan oleh sintaks kumpulan kaedah C# dan mewakilkan beban berlebihan

Senario:

Andaikan anda ingin memanggil fungsi yang mempunyai dua lebihan beban: satu yang menerima perwakilan Tindakan dan satu lagi yang menerima perwakilan Func. Anda lebih suka menggunakan sintaks kumpulan kaedah dan bukannya kaedah tanpa nama (ungkapan lambda).

Soalan:

Apabila anda cuba memanggil lebihan beban ini menggunakan sintaks kumpulan kaedah, anda akan menghadapi ralat panggilan samar-samar pengkompil.

Penjelasan:

Sebab kekaburan ini terletak pada peraturan penukaran tersirat untuk kumpulan kaedah dan jenis perwakilan. Menurut spesifikasi C#, kumpulan kaedah boleh ditukar secara tersirat kepada jenis perwakilan yang serasi. Walau bagaimanapun, "keserasian" dalam konteks ini merujuk kepada keserasian kaedah dan perwakilan jenis, bukan keserasian kumpulan kaedah dan jenis perwakilan.

Dalam contoh yang diberikan, kumpulan kaedah classWithSimpleMethods.GetString ialah calon yang sah untuk kedua-dua lebihan perwakilan: classWithDelegateMethods.Method(Action) dan classWithDelegateMethods.Method(Func<string>). Memandangkan tiada peraturan jenis yang jelas untuk menentukan penukaran yang lebih baik, pengkompil menghasilkan ralat panggilan yang tidak jelas.

Penyelesaian:

Untuk menyelesaikan kekaburan ini, anda boleh memberikan pelakon yang jelas kepada jenis perwakilan yang sepadan, seperti berikut:

<code class="language-csharp">classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);
classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);</code>

C# 7.3 Kemas Kini:

Bermula dalam C# 7.3, anda tidak lagi mendapat ralat panggilan yang samar-samar apabila menggunakan sintaks kumpulan kaedah. Terima kasih kepada susunan calon lebihan yang dipertingkatkan, pengkompil kini menyimpulkan dengan betul jenis perwakilan yang dijangkakan berdasarkan konteks.

Atas ialah kandungan terperinci Mengapakah Sintaks Kumpulan Kaedah Menyebabkan Ralat Seruan Samar-samar dengan Lebihan Perwakilan?. 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