配列型の引数とは別に、paramsキーワード(C#)・ParamArrayキーワード(VB)を使うことにより、引数を可変長とすることができます。 可変長の引数では、引数に渡す値は必ずしも配列にする必要はありません(配列を直接渡すこともできます)。 メソッド側では、可変長引数は通常の配列と同様に扱うことができます。

可変長引数を使って任意個の値を渡す
using System;

class Sample {
  // 引数で与えられた複数の値の合計を求めるメソッド
  static long Sum(params int[] arr)
  {
    var sum = 0L;

    foreach (var val in arr) {
      sum += val;
    }

    return sum;
  }

  static void Main()
  {
    Console.WriteLine("合計 = {0}", Sum(2, 5, 3));
    Console.WriteLine("合計 = {0}", Sum(2, 5, 3, 8, 4));
    Console.WriteLine("合計 = {0}", Sum(new int[] {2, 5, 3, 8, 4})); // 配列を渡すこともできる
  }
}

可変長引数は、必ずメソッドの一番最後の引数でなければなりません。 例えば、可変長引数のあとに通常の引数をとるようなメソッドを作成することはできません。

可変長引数を定義できる位置
// このように通常の引数のあとに可変長引数をとるようなメソッドは宣言できる
void ParamsMethodOK(int firstValue, params int[] values) {}

// このように可変長引数のあとに通常の引数をとるようなメソッドは宣言できない
void ParamsMethodNG(params int[] values, int lastValue) {}
可変長引数を定義できる位置
' このように通常の引数のあとに可変長引数をとるようなメソッドは宣言できる
Sub ParamsMethodOK(ByVal firstValue As Integer, ByVal ParamArray values() As Integer)
End Sub

' このように可変長引数のあとに通常の引数をとるようなメソッドは宣言できない
Sub ParamsMethodNG(ByVal ParamArray values() As Integer, ByVal lastValue As Integer)
End Sub

可変長引数の型をobjectにすることにより、任意の型の値を任意個とることができるようになります。 例えば、Console.WriteLineメソッドString.Joinメソッドではobject型の可変長引数をとることができるようになっています。