Como han dicho otros, los valores predeterminados no pueden ser matrices. Sin embargo, una forma de evitar esto es hacer el nulo valor predeterminado y luego inicializar la matriz si es necesario:
public void Foo(int[] x = null)
{
x = x ?? new int[] { 5, 10 };
}
O si usted no va a mutar la matriz ni lo exponga a la persona que llama:
private static readonly int[] FooDefault = new int[] { 5, 10 };
public void Foo(int[] x = null)
{
x = x ?? FooDefault;
}
Tenga en cuenta que esto supone que null
no es un valor que desee utilizar por cualquier otro motivo. No es una idea aplicable a nivel mundial, pero funciona bien en algunos casos donde no se puede expresar el valor predeterminado como una constante de tiempo de compilación. Puede usar lo mismo para cosas como Encoding.UTF8
como codificación predeterminada.
Si desea un parámetro de tipo de valor, puede hacer que sea un parámetro que se pueda anular. Por ejemplo, supongamos que desea establecer un parámetro predeterminado para la cantidad de procesadores (que claramente no es una constante de tiempo de compilación) que pueda hacer:
public void RunInParallel(int? cores = null)
{
int realCores = cores ?? Environment.ProcessorCount;
}
¡Oh, qué terrible! Es el mismo problema que los atributos, pero estoy bastante seguro de que realmente puedes usar matrices para ellos. ¿Por qué no puedes declarar una matriz inicializada? Son constantes –
@Graphain: ¿De qué manera es constante cualquier matriz que no sea una vacía? Las matrices no vacías siempre son mutables. El compilador debería crear una copia de la matriz en cada llamada, en caso de que algo (por ejemplo, el método llamado) haya cambiado los contenidos. –
@Jon Skeet - Bueno, uno supondría que si los valores predeterminados requieren una constante, el compilador sería lo suficientemente inteligente como para tratar una matriz como de solo lectura. La única forma que está cambiando es que alguien juegue con la reflexión correcta, que sería el mismo problema para las constantes verdaderas (por ejemplo, cuerda, etc.). –