C#に複数のparams
パラメーターを含めることはできますか?このようなもの:
void foobar(params int[] foo, params string[] bar)
しかし、それが可能かどうかはわかりません。そうである場合、コンパイラは引数をどこに分割するかをどのように決定しますか?
Params引数は1つしか持てません。 2つの配列引数を使用でき、呼び出し元は配列初期化子を使用してメソッドを呼び出すことができますが、params引数は1つだけです。
void foobar(int[] foo, string[] bar)
...
foobar(new {1, 2,3}, new {"a", "b", "c"});
いいえ、これは不可能です。これを取る:
void Mult(params int[] arg1, params long[] arg2)
コンパイラはこれをどのように解釈するのですか?
Mult(1, 2, 3);
次のいずれかとして読み取ることができます。
Mult(new int[] { }, new long[] { 1, 2, 3 });
Mult(new int[] { 1 }, new long[] { 2, 3 });
Mult(new int[] { 1, 2 }, new long[] { 3 });
Mult(new int[] { 1, 2, 3 }, new long[] { });
ただし、次のように2つの配列をパラメータとして使用できます。
void Mult(int[] arg1, params long[] arg2)
From MSDN-params
メソッド宣言のparamsキーワードの後にパラメーターを追加することはできません。また、メソッド宣言ではparamsキーワードを1つだけ許可します。
私はこれが非常に古い投稿であることを知っていますが、ここに:
C#7では、実際にできます。これを行うには、_System.ValueTuple
_を使用できます。
_private void Foorbar(params (int Foo, string Bar)[] foobars)
{
foreach (var foobar in foobars)
Console.WriteLine($"foo: {foobar.Foo}, bar: {foobar.Bar}");
}
_
そして、あなたはこのようにそれを使うことができます:
_private void Main() => Foobar((3, "oo"), (6, "bar"), (7, baz));
_
そして明らかな出力:
_Foo: 3, Bar: foo
Foo: 6, Bar: bar
Foo: 7, Bar: baz
_
唯一の欠点は、これを行う必要があることです。_foobars[0].foo;
_ではなく_foos[0];
_ですが、それは本当に小さな問題です。その上、本当に望めば、拡張や関数を作成して配列に変換することもできますが、それだけの価値はないと思います。
いいえ、許可されるパラメーターは1つだけであり、それが最後の引数でなければなりません。読む これ
これは動作します
public void Correct(int i, params string[] parg) { ... }
しかし、これはうまくいきません
public void Correct(params string[] parg, int i) { ... }
不可能です。メソッド宣言ごとにparamsキーワードを1つだけにすることができます-MSDNから- http://msdn.Microsoft.com/en-us/library/w5zay9db(v = vs.71).aspx