2016-04-08 77 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 
}