Visual Basicでは、ParamArrayパラメータを使用して、手続きまたは関数に可変数の引数を渡すことができます。これは、同じ型の引数を持つ不定数のパラメータのメソッドを作成するための便利な方法です。
Sub ShowNumbers(ParamArray numbers() As Integer) For Each n As Integer In numbers Console.WriteLine(n) Next End Sub ' 呼び出し: ShowNumbers(1, 2, 3, 4) ShowNumbers() ' 引数なしでの呼び出しが可能
ParamArrayは1つだけで、リストの最後でなければなりません。ParamArray型の引数は常に配列として渡され、ByRefにはできません。ParamArrayは、1つの手続きが同じ型の異なる数のパラメータを受け取ることを可能にしますが、オーバーロードは異なる署名を持つ複数のメソッドを作成します。
オーバーロードの例:
Sub Add(a As Integer, b As Integer) ' ... End Sub Sub Add(a As Integer, b As Integer, c As Integer) ' ... End Sub
使用する時:
ParamArray: 同じ型の数が多い場合。質問: 手続きはParamArrayと他のパラメータを同時に含むことができますか、それらの順序に関する制約はありますか?
回答: はい、できますが、ParamArrayは必ず最後のパラメータでなければならず、署名内で一つだけです。
誤った使用例:
Sub Test(ParamArray x() As Integer, y As String) ' コンパイルエラー End Sub
正しいオプション:
Sub Test(y As String, ParamArray x() As Integer) ' 正しい End Sub
物語
ParamArrayを用いて異なるソースからデータを収集する関数を構築しましたが、多くのケースで配列を手動で渡しました。開発者は、配列の渡しがネスト配列(配列の配列)を引き起こすことに気づかず、結果として常に処理が不正確になり、報告データが損なわれました。
物語
SQLクエリを普遍的に構築するためにParamArray String引数が使用されましたが、メソッドを更新する際にParamArrayの後に必須パラメータを追加しました。システム全体がコンパイルできなくなりました。
物語
異なるパラメータセットを持つメソッドのオーバーロードにParamArrayとオーバーロードの両方を使用しました。これにより、あいまいさの衝突が発生し、コンパイラはどのメソッドを呼び出すべきかを常に決定できませんでした。なぜなら、
ParamArrayが複数のオーバーロードに適合したからです。