首頁 > 後端開發 > C++ > 為什麼方法組語法會導致委託重載時出現不明確的呼叫錯誤?

為什麼方法組語法會導致委託重載時出現不明確的呼叫錯誤?

Linda Hamilton
發布: 2025-01-13 10:10:43
原創
794 人瀏覽過

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

C# 方法組語法與委託重載導致的歧義呼叫錯誤

情景:

假設您要呼叫一個具有兩個重載的函數:一個接受 Action 委託,另一個接受 Func 委託。您更傾向於使用方法組語法而不是匿名方法(lambda 表達式)。

問題:

當您嘗試使用方法群組語法呼叫這些重載時,會遇到編譯器 歧義呼叫 錯誤。

解釋:

這種歧義的原因在於方法群組和委託類型的隱式轉換規則。根據 C# 規範,方法組可以隱式轉換為相容的委託類型。但是,此上下文中的「相容」是指方法和委託 類型 的兼容性,而不是方法群組和委託類型的兼容性。

在給定的範例中,方法群組 classWithSimpleMethods.GetString 對於兩個委託重載都是有效的候選者:classWithDelegateMethods.Method(Action)classWithDelegateMethods.Method(Func<string>)。由於沒有明確的類型規則來確定哪個轉換更好,編譯器會產生歧義呼叫錯誤。

解決方法:

為了解決這種歧義,您可以提供對應委託類型的明確強制轉換,如下所示:

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

C# 7.3 更新:

從 C# 7.3 開始,使用方法群組語法時不再出現歧義呼叫錯誤。由於改進了重載候選者的排序,編譯器現在可以根據上下文正確推斷預期的委託類型。

以上是為什麼方法組語法會導致委託重載時出現不明確的呼叫錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板