params如何在c#中工作(一种据称隐藏另一种方法的方法)

时间:2013-10-04 08:58:16

标签: c# params

c#如何使params有效。

当你有像

这样的代码时
 static string Concat(int arg)
 {
     return arg.ToString();
 }

static string Concat(int arg, params string[] p)
{
    string result = string.Empty;
    result = result + arg.ToString();
    foreach (var s in p)
    {
        result = result + s;
    }
    return result;
}

Resharper说用params的方法隐藏了另一种方法。这是否暗示在引擎盖下正在定义另一种方法并调用带有params传递空数组的方法?或完全不同的东西?

(请不要陷入糟糕的代码 - 这只是一个例子)

编辑解释:

如果我没有定义静态字符串Concat(int arg)方法,我仍然可以调用第二个

var s = Concat(123);

尽管没有定义这个方法....所以问题是:第一个方法隐含地定义在引擎盖下并用空数组调用第二个方法。注意我将arg类型从string更改为int。

解释我所看到的怪异。当你按上面的方式调用时......它用空数组命中params对象,param不是null - 这就是我所期望的。当我第一次写出foreach循环时,我对params进行了空检查,然后发现我不需要它。

所以......你的理由是它必须在数组中的第一个参数之后包装任何参数吗?一点内联代码? ...所以如果你传入“dave”,你会得到freddave作为输出......

但是将null传递给它......

static void Main(string[] args)
{
    Console.WriteLine(Concat("fred",null));
}

 //static string Concat(string arg)
 //{
 //    return arg;
 //}

static string Concat(string arg, params int[] p)
{
    string result = string.Empty;
    result = result + arg;
    if (p != null)
    {
        foreach (var s in p)
        {
            result = result + s.ToString();
        }
    }

    return result;
}

你发现在这种情况下p实际上是空的... 如果你使用字符串示例...那个预期的数组,其中1个元素为null ...而是整个params对象为null。

1 个答案:

答案 0 :(得分:4)

我认为称之为“隐藏”在这里是误导性的,说实话。

两种方法都是明确创建的,但如果你打电话:

Concat(5);

然后对于该调用,两个方法都是适用的(在C#规范第7.5.3.1节的术语中),但第一种方法是更好(第7.5.3.2节)因为这个:

  
      
  • 否则,如果M P 适用于其正常形式且M Q 具有params数组且仅适用于其扩展形式,则M P 优于M Q
  •   

因此,在这种情况下,将调用第一个方法。

如果没有指定至少一个字符串,则无法使用params扩展调用第二个方法。当然,它仍然可以用空数组调用:

Concat(5, new string[0]);