Pasar una matriz vacía como valor predeterminado de un parámetro opcional [duplicar]


Esta pregunta ya tiene una respuesta aquí:

¿Cómo se define una función que toma una matriz opcional con una matriz vacía como predeterminada?

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

Resultados en:

El valor predeterminado del parámetro para 'array' debe ser una constante en tiempo de compilación.

Author: colinfang, 2010-08-14

3 answers

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

La única constante válida en tiempo de compilación que puedes usar es null, así que cambia tu código a esto:

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

Y dentro de tu método haz esto:

array = array ?? new ushort[0];
 96
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-13 20:22:17

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

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

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

 19
Author: chkn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-28 20:10:13

Sé que es una pregunta antigua, y aunque esta respuesta no resuelve directamente cómo sortear 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){

      ...
   }
 4
Author: Darius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-05 23:03:17