Il paramsmodificatore di parametro fornisce ai chiamanti una sintassi del collegamento per passare più argomenti a un metodo. Esistono due modi per chiamare un metodo con un paramsparametro:
1) Chiamata con un array del tipo di parametro, nel qual caso la paramsparola chiave non ha alcun effetto e l'array viene passato direttamente al metodo:
object[] array = new[] { "1", "2" };
// Foo receives the 'array' argument directly.
Foo( array );
2) Oppure, chiamando con un elenco esteso di argomenti, nel qual caso il compilatore avvolgerà automaticamente l'elenco di argomenti in un array temporaneo e lo passerà al metodo:
// Foo receives a temporary array containing the list of arguments.
Foo( "1", "2" );
// This is equivalent to:
object[] temp = new[] { "1", "2" );
Foo( temp );
Per passare un array di oggetti a un metodo con un params object[]parametro " ", è possibile:
1) Creare manualmente un array wrapper e passarlo direttamente al metodo, come indicato da lassevk :
Foo( new object[] { array } ); // Equivalent to calling convention 1.
2) Oppure, cast l'argomento object, come menzionato da Adam , nel qual caso il compilatore creerà l'array wrapper per te:
Foo( (object)array ); // Equivalent to calling convention 2.
Tuttavia, se l'obiettivo del metodo è elaborare più array di oggetti, potrebbe essere più semplice dichiararlo con un params object[][]parametro " " esplicito . Ciò consentirebbe di passare più array come argomenti:
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 );
Modifica: Raymond Chen descrive questo comportamento e come si collega alla specifica C # in un nuovo post .