假设我有以下方法:
public static void MyCoolMethod(params object[] allObjects)
{
}
public static void MyCoolMethod(object oneAlone, params object[] restOfTheObjects)
{
}
如果我这样做:
MyCoolMethod("Hi", "test");
哪一个被调用,为什么?
它很容易测试 - 调用第二种方法。
至于原因 - C# 语言规范对于如何解决不明确的函数声明有一些非常详细的规则。关于接口、继承和重载有很多问题,其中有一些具体示例说明为什么调用不同的重载,但要回答这个特定实例:
7.5.3.2 更好的功能成员
为了确定
更好的功能成员,a
精简参数列表 A 是
构造仅包含
参数表达式本身
它们在原文中出现的顺序
参数列表。
每个的参数列表
候选函数成员是
按以下方式构建:
更进一步...
如果参数类型序列 {P1, P2, …, PN} 和 {Q1, Q2, …, QN} 等价 > (即每个 Pi 都有到相应 Qi 的恒等转换),则以下
应用平局打破规则,以确定更好的功能成员。
-
如果 MP 是非泛型方法而 MQ 是泛型方法,则 MP 优于 MQ。
-
否则,如果 MP 以其正常形式适用并且 MQ 有一个 params 数组并且是
仅适用于其扩展形式,则 MP 优于 MQ。
-
否则,如果 MP 的声明参数多于 MQ,则 MP 优于 MQ。
如果两种方法都有参数数组并且仅适用于其各自的情况,则可能会发生这种情况
扩展的形式。
粗体打破平局规则似乎适用于本例。该规范详细介绍了如何以正常形式和扩展形式处理 params 数组,但最终的经验法则是,将根据参数的数量和类型调用最具体的重载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)