Tengo un método que toma params object [] como:
void Foo(params object[] items)
{
Console.WriteLine(items[0]);
}
Cuando paso dos matrices de objetos a este método, funciona bien:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]
Pero cuando paso un solo objeto [], no toma mi objeto [] como primer parámetro, sino que toma todos sus elementos como si quisiera pasarlos uno por uno:
Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]
¿Cómo paso un solo objeto [] como primer argumento a una matriz de parámetros?
El
params
modificador de parámetros proporciona a los llamantes una sintaxis de acceso directo para pasar múltiples argumentos a un método. Hay dos formas de llamar a un método con unparams
parámetro:1) Llamar con una matriz del tipo de parámetro, en cuyo caso la
params
palabra clave no tiene efecto y la matriz se pasa directamente al método:2) O, llamando con una lista extendida de argumentos, en cuyo caso el compilador ajustará automáticamente la lista de argumentos en una matriz temporal y la pasará al método:
Para pasar una matriz de objetos a un método con un
params object[]
parámetro " ", puede:1) Cree una matriz de contenedor manualmente y páselo directamente al método, como lo menciona lassevk :
2) O bien, eche el argumento a
object
, como lo mencionó Adam , en cuyo caso el compilador creará la matriz de envoltura para usted:Sin embargo, si el objetivo del método es procesar múltiples matrices de objetos, puede ser más fácil declararlo con un "
params object[][]
" parámetro explícito . Esto le permitiría pasar múltiples matrices como argumentos:Editar: Raymond Chen describe este comportamiento y cómo se relaciona con la especificación C # en una nueva publicación .
fuente
Esta es una solución de una línea que involucra LINQ.
fuente
Necesita encapsularlo en otra matriz object [], como esta:
fuente
Otra forma de resolver este problema (no es tan buena práctica pero se ve hermosa):
Uso:
fuente
Una opción es que puede envolverlo en otra matriz:
Es feo, pero dado que cada elemento es una matriz, no puedes simplemente lanzarlo para que el problema desaparezca ... como si fuera Foo (elementos de objeto params), entonces simplemente podrías hacer:
Alternativamente, podría intentar definir otra instancia sobrecargada de Foo que toma solo una matriz:
fuente
fuente