J'ai une méthode qui prend un objet params [] tel que:
void Foo(params object[] items)
{
Console.WriteLine(items[0]);
}
Lorsque je passe deux tableaux d'objets à cette méthode, cela fonctionne bien:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]
Mais quand je passe un seul objet [], il ne prend pas mon objet [] comme premier paramètre, à la place il prend tous ses éléments comme je voulais les passer un par un:
Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]
Comment passer un seul objet [] comme premier argument à un tableau de paramètres?
Le
params
modificateur de paramètre donne aux appelants une syntaxe de raccourci pour passer plusieurs arguments à une méthode. Il existe deux façons d'appeler une méthode avec unparams
paramètre:1) Appel avec un tableau du type paramètre, auquel cas le
params
mot - clé n'a aucun effet et le tableau est passé directement à la méthode:2) Ou, en appelant avec une liste étendue d'arguments, auquel cas le compilateur encapsulera automatiquement la liste d'arguments dans un tableau temporaire et le passera à la méthode:
Pour passer un tableau d'objets à une méthode avec un
params object[]
paramètre " ", vous pouvez soit:1) Créez un tableau de wrapper manuellement et passez-le directement à la méthode, comme mentionné par lassevk :
2) Ou, transtypez l'argument en
object
, comme mentionné par Adam , auquel cas le compilateur créera le tableau wrapper pour vous:Cependant, si le but de la méthode est de traiter plusieurs tableaux d'objets, il peut être plus facile de le déclarer avec un
params object[][]
paramètre explicite " ". Cela vous permettrait de passer plusieurs tableaux comme arguments:Edit: Raymond Chen décrit ce comportement et comment il se rapporte à la spécification C # dans un nouvel article .
la source
Il s'agit d'une solution en une ligne impliquant LINQ.
la source
Vous devez l'encapsuler dans un autre tableau d'objets [], comme ceci:
la source
Une autre façon de résoudre ce problème (ce n'est pas une bonne pratique mais ça a l'air beau):
Usage:
la source
Une option est que vous pouvez l'envelopper dans un autre tableau:
Un peu moche, mais comme chaque élément est un tableau, vous ne pouvez pas simplement le lancer pour faire disparaître le problème ... comme s'il s'agissait de Foo (éléments d'objet params), alors vous pourriez simplement faire:
Vous pouvez également essayer de définir une autre instance surchargée de Foo qui ne prend qu'un seul tableau:
la source
la source