C# 方法組語法與委託重載導致的歧義呼叫錯誤
情景:
假設您要呼叫一個具有兩個重載的函數:一個接受 Action 委託,另一個接受 Func
問題:
當您嘗試使用方法群組語法呼叫這些重載時,會遇到編譯器 歧義呼叫 錯誤。
解釋:
這種歧義的原因在於方法群組和委託類型的隱式轉換規則。根據 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中文網其他相關文章!