2013-02-20 3 views
3

Comme vous le savez C# prend en charge les méthodes variadique par le mot-clé params:Déballer un tableau dans les arguments de méthode

int Add(params int[] xs) { 
    return xs.Sum(); 
} 

qui peut alors être appelé avec un certain nombre d'arguments que vous voulez:

Add(1); 
Add(1, 2); 
Add(1, 2, 3); 

Mais disent Je veux appeler Add en utilisant un tableau de int s . Est-ce possible et comment (de préférence sans réflexion)? J'ai essayé les éléments suivants, mais ils nous ont donné des erreurs de syntaxe (la syntaxe était pure devinette):

var xs = new[] { 1, 2, 3 }; 
Add(xs...); // doesn't work; syntax error 
Add(params xs); // doesn't work; syntax error 

Mon cas d'utilisation réelle est différente, mais je pensais que cet exemple serait moins compliqué.

+0

Que voulez-vous dire par ne fonctionne pas? – antonijn

+0

Erreur de syntaxe @Antonijn. –

+0

http://stackoverflow.com/questions/36350/how-to-pass-a-single-object-to-a-params-object Ce fil dit que cela devrait fonctionner. La simplification pourrait-elle cacher quelque chose? –

Répondre

9

Votre méthode a besoin d'un type de retour:

int Add(params int[] xs) { 
    return xs.Sum(); 
} 

Et pour appeler avec un tableau que vous venez d'utiliser la syntaxe ordinaire pour les appels méthode:

int[] xs = new[] { 1, 2, 3 }; 
var result = Add(xs); 
+0

+1 pour répondre à l'une des questions les plus compliquées sur SO .. –

+0

Que se passerait-il si 'Add' prend' object [] '? Tout type est convertible en 'object', donc cela ne serait-il pas ambigu? –

+0

vous avez réellement besoin de lancer les objets internes. vous pouvez essayer var xsAsObjcet = xs.ToList.Cast () .ToArray; –

0

Pour autant que je sache, vous peut simplement l'appeler avec un tableau comme vous le feriez d'une méthode normale:

Add(xs); 

Rien fan cy, no params mot-clé de l'appel de méthode, aucun point.

0
static void Main(string[] args) 
{ 
    int[] tmp = {1, 2}; 
    var sum = Add(tmp); 
} 
public static int Add(params int[] xs) 
{ 
    return xs.Sum(); 
} 

devrait fonctionner très bien ..

2

Le mot-clé params fondamentalement juste vous permet de profiter d'un peu de sucre syntaxique. Il indique au compilateur que quand il voit

Add(1, 2, 3); 

Il faut convertir en

Add(new int[] { 1, 2, 3}); 

Donc, pour le faire à partir de votre code, vous ne devez pas faire quelque chose de spécial.

int[] parameters = new int[] { ... } 
results = Add(parameters); 

Voir the documentation pour plus de détails.

+1

utilise '@ params' pour le nom de variable qui est un mot-clé C#. Cela ne compilera pas –

+0

@IlyaIvanov merci. fixé –

0

Si c'est quelque chose comme Java, vous pouvez simplement appeler la méthode avec le tableau comme argument.

Cette fonction est aussi ce qui rend varargs dangereux, surtout si l'un des types de vararg est aussi un tableau ...

Questions connexes