paramsキーワードによる配列引数の簡略化

プログラミングC# 第6版 7.1.1.1


これは凄い仕様ですね。一見するとCの可変長引数みたいに見えますが、関数の受け取り側で配列になってくれると言う点でかなり違います。

兎にも角にも動作確認してみます。

using System;

class Program {
    // paramsキーワードを付ける
    static void Output (params string[] strs) {
        foreach(string str in strs) {
            Console.WriteLine(str);
        }
    }
    
    static void Main () {
        // params指定されているので普通の引数みたいに渡せる
        Output("foo","bar","baz");
    }
}
$ main
foo
bar
baz

いやあ、これは良い機能ですね。

ちなみに引数を配列に変換してしまうという仕様なのでparams指定できるのは最後の引数だけとなるようです。

    // params指定引数の後ろに引数を追加するとコンパイルエラー
    static void Output (params string[] strs, int i) {
        foreach(string str in strs) {
            Console.WriteLine(str);
        }
    }
$ csc main.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.

main.cs(5,22): error CS0231: パラメーター配列は仮パラメーター リストで最後のパラメーターでなければなりません。

手前なら引数を追加できます。

using System;

class Program {
    // 手前に引数を追加
    static void Output (int i, params string[] strs) {
        Console.WriteLine(i);
        foreach(string str in strs) {
            Console.WriteLine(str);
        }
    }
    
    static void Main () {
        Output(100,"foo","bar","baz");
    }
}
$ main
100
foo
bar
baz

あともちろんですが、paramsキーワードが付いていても明示的に配列を渡すことも可能です。

    static void Main () {
        // 明示的に配列を渡す
        Output(new string[] {"foo","bar","baz" });
    }

面白いです。