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。
答案 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]);