2010-12-15 7 views
15

Aquí es una función de ejemplo:¿Puedo especificar un parámetro de color predeterminado en C# 4.0?

public void DrawSquare(int x, int y, Color boxColor = Color.Black) 
{ 
    //Code to draw the square goes here 
} 

El compilador me mantiene dando el error: Default parameter value for 'boxColor'must be a compile-time constant

He tratado

Color.Black, 
Color.FromKnownColor(KnownColor.Black), and 
Color.FromArgb(0, 0, 0) 

¿Cómo hago Color.Black sea el color por defecto? Además, no quiero usar una cadena Black para especificarla (que sé que funcionaría). Quiero el valor Color.Black.

Respuesta

11

Color.Black es un estático, no una constante, entonces no, no puede hacer esto.

Para usar un valor predeterminado, puede hacer que el parámetro sea nulo (Color?), y si es nulo, configúrelo en Negro.

+0

Lo tenía en mi respuesta, pero si va a especificar un argumento nulo, ¿por qué no especifica Color.Black? :) –

+0

@George: "Color.Black es una estática, no una constante". – Vlad

+0

El color es una estructura, por lo que si usaras el tipo Nullable como tipo (o en C# Color? Para abreviar), entonces puede ser nulo. –

11

hacer esto:

void foo(... Color boxColor = default(Color)) 
{ 
    if(object.Equals(boxColor, default(Color))) boxColor = Color.Black; 

    // ... 
} 
+0

¿por qué no simplemente 'if (boxColor == default (Color))'? – Vlad

+0

No hace la diferencia. Prefiero la notación Equals, pero con los tipos de valor, '==' es idéntico. –

+0

@Mr. TA: bueno, en este caso podría ser mejor usar 'Color.Equals' en lugar de' object.Equals'. O mejor 'predeterminado (Color) .Equals (boxColor)' para que use la función virtual. En mi opinión, '==' es más legible, pero es una cuestión de gusto personal. – Vlad

9

¿Qué hay de malo en hacer que sea sencillo?

public void DrawSquare(int x, int y) 
{ 
    DrawSquare(x,y,Color.Black); 
} 

public void DrawSquare(int x, int y, Color color) 
{ 
    // Do your thing. 
} 
+1

La función real no es tan simple. Tiene alrededor de 10 parámetros (la mayoría de los cuales son opcionales y se pueden especificar como opcionales). Además, hay 5 o 6 funciones diferentes con estos parámetros y dos variaciones de cada función. Hacer lo anterior agregaría demasiadas funciones. Gracias por la sugerencia, sin embargo. –

Cuestiones relacionadas