方法组语法和带有委托重载的不明确调用
在处理接受 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中文网其他相关文章!