128 votes

Comment passer un objet unique [] à un params object]

J’ai une méthode qui prend les params object [] comme :

Lorsque je passais deux tableaux de l’objet à cette méthode, il fonctionne très bien :

Mais lors du passage d’un objet single [], il ne prend pas mon object [] comme le premier param, au lieu de cela, il faut sa tous les éléments comme j’ai voulu les passer un par un :

Comment passer un objet unique [] comme premier argument à un tableau params ?

103voto

Adam Wright Points 31715

Une simple conversion de type assurera que le compilateur sait ce que tu veux dire dans ce cas.

Comme un tableau est un sous-type de l’objet, tout cela fonctionne. Peu d’une étrange sémantique mais, je suis d’accord.

Edit : Oups, typoed mon exemple de code.

78voto

Emperor XLII Points 5493

L' params paramètre modificateur donne une syntaxe raccourcie pour passer plusieurs arguments pour une méthode. Il y a deux façons d'appeler une méthode avec un params paramètre:

1) l'Appel avec un tableau du type de paramètre, auquel cas l' params mot-clé n'a aucun effet et le tableau est transmis directement à la méthode:

object[] array = new[] { "1", "2" };

// Foo receives the 'array' argument directly.
Foo( array );

2) Ou, en l'appelant avec une longue liste d'arguments, dans ce cas le compilateur va automatiquement automatiquement la liste des arguments dans un tableau temporaire et le passer à la méthode:

// Foo receives a temporary array containing the list of arguments.
Foo( "1", "2" );

// This is equivalent to:
object[] temp = new[] { "1", "2" );
Foo( temp );


Afin de passer dans un tableau d'objet à une méthode avec un "params object[]" paramètre, vous pouvez soit:

1) Créer un wrapper tableau manuellement et passer directement à la méthode, comme mentionné par lassevk:

Foo( new object[] { array } );  // Equivalent to calling convention 1.

2) Ou, fonte de l'argument d' object, comme l'a dit Adam, auquel cas le compilateur va créer de l'emballage du tableau pour vous:

Foo( (object)array );  // Equivalent to calling convention 2.


Toutefois, si l'objectif de la méthode est le processus de plusieurs tableaux d'objets, il peut être plus facile de le déclarer explicitement avec un "params object[][]" paramètre. Cela vous permettra de passer plusieurs tableaux comme arguments:

void Foo( params object[][] arrays ) {
  foreach( object[] array in arrays ) {
    // process array
  }
}

...
Foo( new[] { "1", "2" }, new[] { "3", "4" } );

// Equivalent to:
object[][] arrays = new[] {
  new[] { "1", "2" },
  new[] { "3", "4" }
};
Foo( arrays );

Edit: Raymond Chen décrit ce comportement et comment il se rapporte à la spécification C# dans un nouveau post.

3voto

Lasse V. Karlsen Points 148037

Vous devez encapsuler dans un autre objet [] array, comme ceci :

1voto

Mike Stone Points 21293

Une option est que vous pouvez envelopper dans un autre tableau :

Genre du laid, mais étant donné que chaque élément est un tableau, vous ne peut pas juste effectuer un cast pour rendre le problème disparaissent... comme si c’étaient des Foo (params object points), alors vous pourriez juste faire :

Alternativement, vous pouvez essayer de définir une autre instance surchargée de truc qui prend juste un tableau unique :

1voto

Homero Barbosa Points 886
new[] { (object) 0, (object) null, (object) false }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X