2010-06-29 10 views
6

¿Es posible en los parámetros de valores predeterminados del método C# 4.0 como matriz (por ejemplo string [] sArray)? en caso afirmativo, ¿cómo implementarlo?C# 4.0: Valores predeterminados del parámetro de método como matriz

me trataron función de llamada, como a continuación:

MethodA(string[] legends=new string[]{"a","b"},float[] values=new float[]{1,2}, string alt="sd"); 

No es trabajo

Respuesta

10

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; 
} 
3

valores por defecto debe ser en tiempo de compilación constante, lo que significa que las matrices no se pueden utilizar.

El estándar (pg 312) dice esto:

La expresión en una forma predeterminada-argumento debe ser una de las siguientes:

  • una constante-expresión
  • una expresión de la formar nuevo S() donde S es un tipo de valor
  • una expresión de la forma por defecto (S) donde S es un tipo de valor
+0

¡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 –

+1

@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. –

+0

@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.). –

Cuestiones relacionadas