2016-04-08 44 views
1

我知道如何使用关键字params声明可变长度参数列表。但是当你想将这些可变长度参数传递给另一个函数时如何。例如:C#正向变量长度参数

public static void Main() { 
    varargs_m1(1,2,3,4); 
} 

public static void varargs_m1(params object[] args) { 
    varargs_m2(args);  // Writes args.Length = 4 
    varargs_m2(0, args); // Writes args.Length = 2 
          // args = [0, [1,2,3,4]] 
} 

public static void varargs_m2(params object[] args) { 
    Console.WriteLine("args.Length = " + args.Length); 
} 

当我打电话varargs_m2(0, args)我怎么能得到的参数为[0,1,2,3,4]而不是[0,[1,2,3,4]

回答

2

你可以串连的含{0}一个新的阵列与现有的数组,然后传递沿着使用LINQ Concat()方法:

public static void varargs_m1(params object[] args) 
{ 
    varargs_m2(new object[]{0}.Concat(args).ToArray()); 
} 

如果您想要完全避免使用LINQ,你可以简单地创建一个新的数组并且以这种方式处理它:

public static void varargs_m1(params object[] args) 
{ 
    // Your new values 
    var newValues = new object[]{ 0 }; 
    // Build a new array 
    var combined = new object[newValues.Length + args.Length]; 
    // Copy each of your values into the new array 
    newValues.CopyTo(combined, 0); 
    args.CopyTo(combined, newValues.Length); 
    // Pass your new values along 
    varargs_m2(combined); 
} 
0

只有参数类型为object[]时,才会产生混淆。尝试切换到int[],一切都将清晰。

顺便说一句回答你发现:

public static void varargs_m1(params object[] args) 
{ 
    varargs_m2(args); // 4 elements 
    var anotherArgs = new List<object>(args); 
    anotherArgs.Insert(0, 0); 
    // do other manipulations whatever you want... 
    varargs_m2(anotherArgs.ToArray()); // 5 elements 
}