web-dev-qa-db-fra.com

Plusieurs paramètres "params" sont-ils possibles?

Est-il possible d'avoir plusieurs paramètres params en C #? Quelque chose comme ça:

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

Mais je ne suis pas sûr que ce soit possible. Si tel est le cas, comment le compilateur déciderait-il où scinder les arguments?

23
garytchao

Vous ne pouvez avoir qu'un seul argument params. Vous pouvez avoir deux arguments de tableau et l'appelant peut utiliser des initialiseurs de tableau pour appeler votre méthode, mais il ne peut y avoir qu'un seul argument params.

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

...

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

Non, ce n'est pas possible. Prends ça:

void Mult(params int[] arg1, params long[] arg2)

comment le compilateur est-il censé interpréter ceci:

Mult(1, 2, 3);

Cela pourrait être lu comme n'importe lequel:

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[] {         });

Vous pouvez cependant prendre deux tableaux comme paramètres:

void Mult(int[] arg1, params long[] arg2)
31
Cole Johnson

De MSDN - params

Aucun paramètre supplémentaire n'est autorisé après le mot clé params dans un fichier déclaration de méthode, et un seul mot clé params est autorisé dans un fichier déclaration de méthode.

12
Habib

Non, un seul paramètre est autorisé et même cela doit être le dernier argument. Lire ceci

Ça va marcher

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

Mais ça ne marchera pas

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

Je sais que c'est un très vieux post, mais ici: 

En C # 7, vous pouvez réellement. Vous pouvez utiliser System.ValueTuple pour faire ceci:

private void Foorbar(params (int Foo, string Bar)[] foobars)
{
    foreach (var foobar in foobars)
        Console.WriteLine($"foo: {foobar.Foo}, bar: {foobar.Bar}");   
}

Et ensuite, vous pouvez l'utiliser comme ceci:

private void Main() => Foobar((3, "oo"), (6, "bar"), (7, baz));

Et la sortie évidente:

Foo: 3, Bar: foo
Foo: 6, Bar: bar
Foo: 7, Bar: baz

Le seul inconvénient est que vous devez faire ceci: foobars[0].foo; au lieu de foos[0];, mais c'est vraiment un tout petit problème. En outre, si vous le vouliez vraiment, vous pouvez créer une extension ou une fonction permettant de les convertir en tableaux, bien que je ne pense pas que cela en vaille la peine.

4
AustinWBryan

Ce n'est pas possible. Il ne peut s'agir que d'un mot clé params par déclaration de méthode - à partir de MSDN - http://msdn.Microsoft.com/en-us/library/w5zay9db(v=vs.71).aspx

0
Dmitry Khryukin