C#如何选择含糊不清和params

时间:2010-07-06 21:07:44

标签: c# params

说我有以下方法:

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

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

如果我这样做:

MyCoolMethod("Hi", "test");

哪一个被调用,为什么?

3 个答案:

答案 0 :(得分:15)

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

至于为什么--C#语言规范有一些关于如何解决模糊函数声明的非常详细的规则。关于SO周围的接口,继承和重载有很多问题,以及为什么调用不同的重载的一些具体示例,但是要回答这个特定的实例:

C# Specification - Overload Resolution

  

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数组并且仅适用于它们,则会发生这种情况   扩展形式。

  •   

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

答案 1 :(得分:6)

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

答案 2 :(得分:1)

这种重载很棘手......

MyCoolMethod(“嗨”,“测试”)显然会调用第二次重载,但是

MyCoolMethod( “你好”); 调用第二个重载。我测试了这个。

因为两个输入都是对象,所以编译器假定传入的任何内容都是一个对象数组,并完全忽略第一个重载。

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