2010-08-13 11 views
60

¿Cómo se define una función que toma una matriz opcional con una matriz vacía como valor predeterminado?Pasar una matriz vacía como valor predeterminado de un parámetro opcional

public void DoSomething(int index, ushort[] array = new ushort[] {}, 
bool thirdParam = true) 

resultados en:

valor de parámetro por defecto de 'array' debe ser una constante de tiempo de compilación.

+1

Esto no es un duplicado. Es específico al preguntar cómo establecer un valor predeterminado para una matriz, no una cadena. Hay una diferencia real en los enfoques – Darren

Respuesta

91

No se pueden crear constantes en tiempo de compilación de las referencias a objetos.

La única válida constante de tiempo de compilación que puede utilizar es null, por lo que cambiar el código para esto:

public void DoSomething(int index, ushort[] array = null, 
    bool thirdParam = true) 

Y dentro de su método de hacer esto:

array = array ?? new ushort[0]; 
+3

sí, eso viene a la mente, excepto que pasar nulo no es lo mismo que una matriz vacía. Esperaba una forma de hacerlo sin tener que vestir el param dentro del método. El bit sobre las constantes de tiempo de uso de referencias de objetos tiene sentido. ¡Gracias! – MandoMando

+0

que arroja ArgumentNullException, ¿alguien sabe por qué? – Ayyash

+2

Sí, no está arreglando el caso de que realmente está recibiendo 'null', ¿utilizó la segunda declaración de mi respuesta? –

15

Si usted puede hacer que el array el último argumento que también podría hacer esto:

public void DoSomething(int index, bool wasThirdParam = true, params ushort[] array) 

El compilador Pase automáticamente una matriz vacía si no está especificada, y obtendrá la flexibilidad añadida de pasar una matriz como un único argumento o poner los elementos directamente como argumentos de longitud variable en su método.

3

sé que es una vieja cuestión, y mientras esta respuesta no resuelve directamente la forma de superar las limitaciones impuestas por el compilador, la sobrecarga de métodos es una alternativa:

public void DoSomething(int index, bool thirdParam = true){ 
     DoSomething(index, new ushort[] {}, thirdParam); 
    } 

    public void DoSomething(int index, ushort[] array, bool thirdParam = true){ 

     ... 
    } 
+0

No estoy seguro de si un compilador podría inferir y optimizar una recursión mutua en lugar de una habitual * (aunque sí, sé que existe una opción '-foptimize-sibling-calls' en g ++, pero es C++, soy no estoy seguro si los compiladores de C# pueden) *. –

Cuestiones relacionadas