2012-10-05 35 views
11

Veo que es posible tener una firma de método donde el primer parámetro proporciona un valor predeterminado y el segundo parámetro es una colección de params.Argumento opcional seguido de los parámetros

Lo que no puedo ver es una forma de utilizar realmente el valor predeterminado del primer argumento.

¿Es posible?

método Ejemplo:

void WaitAllTasks(string message = "Running Task.WaitAll", params Task[] tasks);

inicialmente I trataron omitiendo el parámetro de mensaje cuando se llama al método y también intentado usar parámetros con nombre, que no funciona con params.

Compila, pero ¿es posible usarlo?

Respuesta

23

puedo encontrar tres formas de llamar al método sin especificar un valor para el primer parámetro:

using System; 

class Test 
{ 
    static void PrintValues(string title = "Default", 
          params int[] values) 
    { 
     Console.WriteLine("{0}: {1}", title, 
          string.Join(", ", values)); 
    } 

    static void Main() 
    { 
     // Explicitly specify the argument name and build the array 
     PrintValues(values: new int[] { 10, 20 }); 
     // Explicitly specify the argument name and provide a single value 
     PrintValues(values: 10); 
     // No arguments: default the title, empty array 
     PrintValues(); 
    } 
} 

no he encontrado una forma de especificar múltiples valores sin la construcción de la matriz de forma explícita, aunque ...

+0

¿Qué hay de la reflexión? – Servy

+0

@Servy: No, la reflexión requeriría que especificara todos los argumentos. –

+1

Es extraño que el compilador de C# no permita el uso de 'values: {10,20}' o 'values: (10,20)'. Busqué bastante y parece que tu camino es la mejor manera. – gdoron

Cuestiones relacionadas