web-dev-qa-db-ja.com

複数の「params」パラメータは可能ですか?

C#に複数のparamsパラメーターを含めることはできますか?このようなもの:

void foobar(params int[] foo, params string[] bar)

しかし、それが可能かどうかはわかりません。そうである場合、コンパイラは引数をどこに分割するかをどのように決定しますか?

32
garytchao

Params引数は1つしか持てません。 2つの配列引数を使用でき、呼び出し元は配列初期化子を使用してメソッドを呼び出すことができますが、params引数は1つだけです。

void foobar(int[] foo, string[] bar)

...

foobar(new {1, 2,3}, new {"a", "b", "c"});
36
Samuel Neff

いいえ、これは不可能です。これを取る:

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)
31
Cole Johnson

From MSDN-params

メソッド宣言のparamsキーワードの後に​​パラメーターを追加することはできません。また、メソッド宣言ではparamsキーワードを1つだけ許可します

12
Habib

私はこれが非常に古い投稿であることを知っていますが、ここに:

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];_ですが、それは本当に小さな問題です。その上、本当に望めば、拡張や関数を作成して配列に変換することもできますが、それだけの価値はないと思います。

9
AustinWBryan

いいえ、許可されるパラメーターは1つだけであり、それが最後の引数でなければなりません。読む これ

これは動作します

public void Correct(int i, params string[] parg) { ... }

しかし、これはうまくいきません

public void Correct(params string[] parg, int i) { ... }
5
Nikhil Agrawal

不可能です。メソッド宣言ごとにparamsキーワードを1つだけにすることができます-MSDNから- http://msdn.Microsoft.com/en-us/library/w5zay9db(v = vs.71).aspx

0
Dmitry Khryukin