O params
modificador de parâmetro fornece aos chamadores uma sintaxe de atalho para passar vários argumentos para um método. Existem duas maneiras de chamar um método com um params
parâmetro:
1) Chamando com uma matriz do tipo de parâmetro; nesse caso, a params
palavra-chave não tem efeito e a matriz é passada diretamente para o método:
object[] array = new[] { "1", "2" };
// Foo receives the 'array' argument directly.
Foo( array );
2) Ou, chamando com uma lista estendida de argumentos; nesse caso, o compilador quebra automaticamente a lista de argumentos em uma matriz temporária e a passa para o método:
// Foo receives a temporary array containing the list of arguments.
Foo( "1", "2" );
// This is equivalent to:
object[] temp = new[] { "1", "2" );
Foo( temp );
Para passar uma matriz de objetos para um método com um params object[]
parâmetro " ", você pode:
1) Crie uma matriz de wrapper manualmente e passe-a diretamente para o método, conforme mencionado por lassevk :
Foo( new object[] { array } ); // Equivalent to calling convention 1.
2) Ou, use o argumento object
, como mencionado por Adam , caso em que o compilador criará a matriz do wrapper para você:
Foo( (object)array ); // Equivalent to calling convention 2.
No entanto, se o objetivo do método é processar várias matrizes de objetos, pode ser mais fácil declará-lo com um params object[][]
parâmetro " " explícito . Isso permitiria que você passasse várias matrizes como argumentos:
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 descreve esse comportamento e como ele se relaciona com a especificação C # em uma nova postagem .