方法組語法和帶有委託重載的不明確呼叫
在處理接受 Action
或 Func<string>
委託的重載方法時,使用方法組語法而不是 lambda 表達式可能會導致歧義。 雖然 lambda 表達式無縫工作,但方法組會觸發「不明確的呼叫」錯誤。
明確轉換的必要性:了解轉換規則
根本原因在於C#的方法組委託轉換規則。 方法組隱式轉換為相容委託類型,這表示參數類型和修飾符必須匹配。 至關重要的是,在此隱式轉換期間不考慮返回類型。
在重載決策期間,編譯器會搜尋適用的方法。如果方法的參數可以從提供的參數隱式轉換,則該方法是適用的。 在此場景中,classWithSimpleMethods.GetString()
適用於 Func<string>
和 Action
,因為參數清單為空。 編譯器無法在這些同樣有效的轉換之間進行選擇,因此會出現歧義錯誤。 將方法組明確轉換為 Action
或 Func<string>
可以解決此問題。
C# 7.3 及更高版本:改良的重載解析度
正如 Jon Skeet 所指出的,C# 7.3 引入了重載解析的增強功能,減輕了這種歧義。 在許多情況下,C# 7.3 及更高版本不再需要明確轉換。
以上是為什麼方法組語法會導致重載委託(Action 與 Func)出現「不明確的呼叫」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!