14

假设我有以下方法:

public static void MyCoolMethod(params object[] allObjects)
{
}

public static void MyCoolMethod(object oneAlone, params object[] restOfTheObjects)
{
}

如果我这样做:

MyCoolMethod("Hi", "test");

哪一个被调用,为什么?

4

3 回答 3

15

这很容易测试 - 第二种方法被调用。

至于为什么 - C# 语言规范有一些关于如何解决模棱两可的函数声明的非常详细的规则。关于 SO 周围的接口、继承和重载有很多问题,其中有一些具体的例子说明了为什么调用不同的重载,但要回答这个具体的例子:

C# 规范 - 重载解决方案

7.5.3.2 更好的函数成员

为了确定更好的函数成员,构造了一个精简的参数列表 A,其中仅包含参数表达式本身,按照它们在原始参数列表中出现的顺序。

每个候选函数成员的参数列表按以下方式构造:

  • 如果函数成员仅适用于扩展形式,则使用扩展形式。

  • 从参数列表中删除没有对应参数的可选参数

  • 参数被重新排序,以便它们出现在与参数列表中相应参数相同的位置。

更进一步...

如果参数类型序列 {P1, P2, ..., PN} 和 {Q1, Q2, ..., QN} 是等价的 >(即每个 Pi 具有到相应 Qi 的恒等转换),则应用以下平局规则,以便确定更好的功能成员。

  • 如果 MP 是非泛型方法而 MQ 是泛型方法,则 MP 优于 MQ。

  • 否则,如果 MP 以其正常形式适用,而 MQ 有一个 params 数组且仅适用于其扩展形式,则 MP 优于 MQ。

  • 否则,如果 MP 的声明参数比 MQ 多,则 MP 优于 MQ。如果这两种方法都具有参数数组并且仅适用于它们的扩展形式,则可能会发生这种情况。

粗体的平局规则似乎适用于这种情况。该规范详细介绍了如何以正常和扩展形式处理 params 数组,但最终的经验法则是,将根据参数的数量和类型调用最具体的重载。

于 2010-07-06T21:18:44.290 回答
6

第二个,编译器将首先尝试解析显式声明的参数,然后再返回 params 集合。

于 2010-07-06T21:18:23.573 回答
1

这个重载很棘手......

MyCoolMethod("Hi", "test") 显然调用了第二个重载,但是

我的酷方法(“嗨”); 称为第二次重载。我对此进行了测试。

也许由于两个输入都是对象,编译器假设传入的任何内容都是对象数组,并且完全忽略了第一个重载。

它可能与 womp http://msdn.microsoft.com/en-us/library/aa691338(v=VS.71).aspx提到的更好的函数成员解析有关

于 2010-07-06T21:30:50.053 回答