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中文网其他相关文章!