繁体   English   中英

模糊方法调用c#

[英]Ambiguous method calls c#

任何人都可以解释为什么这些方法:

public IEnumerable<Role> GetRoles(Func<Role, bool> predicate = null)
public IEnumerable<Role> GetRoles(params User[] users)

如果我调用GetRoles(null)它将无法编译,因为方法调用是不明确的,这是正确的,但如果我调用GetRoles()这是合法的并选择public IEnumerable<Role> GetRoles(Func<Role, bool> predicate = null)方法。 为什么这也不模糊?

GetRoles()调用不明确,因为在没有参数的情况下, GetRoles(params User[] users)仅适用于其扩展形式*,而C#语言规范的 §12.6.4.3指定在绑定的情况下某些打破平局规则适用,第二个是:

否则,如果M P以其正常形式适用且M Q具有params阵列并且仅适用于其扩展形式,则M P优于M Q.

因此, GetRoles(Func<Role, bool> predicate = null)被裁定为优于GetRoles(params User[] users)

但是,在调用GetRoles(null)时, params User[] users应用展开形式和非展开形式,在这种情况下,展开的表单将被丢弃 这让你:

GetRoles(Func<Role, bool> predicate = null)
GetRoles(User[] users)

现在没有办法为GetRoles(null)选择更好的匹配。 您必须为该null指定一个类型,以便重载决策可以根据该选择选择最佳候选者。


*通过使用参数数组的元素类型的零个或多个值参数替换函数成员声明中的参数数组来构造展开形式,使得参数列表A中的参数数量与参数的总数相匹配。
C#语言规范 ,§12.6.4.2

这是因为两个参数都是可空的,因此两个方法都可以将null值作为输入,并且无法区分它们。

编译器不知道null是否应该是Func<Role, bool>User[] users ,并且没有足够的信息来对要调用的方法做出任何假设。

您可以按如下方式向编译器提供更多信息:

Func<Role, bool> predicate = null;
GetRoles(predicate); // calls --> GetRoles(Func<Role, bool> predicate = null)

而对于另一种方法:

User[] users = null;
GetRoles(users); // calls GetRoles(params User[] users)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM