2016-04-08 10 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 
} 
関連する問題