2010-05-10 13 views
42
public void log(String msg, Color c = Color.black) 
    { 
     loggerText.ForeColor = c; 
     loggerText.AppendText("\n" + msg); 

    } 

Esto da como resultado un error que c debe ser una constante en tiempo de compilación. He leído un poco sobre esto y la mayoría de los ejemplos tratan sobre cadenas y puntos. He descubierto que puedo usar la clase colorconverter pero no estoy seguro de que sea muy eficiente. ¿Hay alguna forma de pasar un color básico como parámetro opcional?C# 4.0: ¿Puedo usar un color como parámetro opcional con un valor predeterminado?

public void log(String msg, String c = "Black") 
    { 
     ColorConverter conv = new ColorConverter(); 
     Color color = (Color)conv.ConvertFromString(c); 

     loggerText.ForeColor = color; 
     loggerText.AppendText("\n" + msg); 
    } 

Respuesta

83

Me he encontrado con esto también y la única solución que he encontrado es usar elementos nulables.

public void log(String msg, Color? c = null) 
{ 
    loggerText.ForeColor = c ?? Color.Black; 
    loggerText.AppendText("\n" + msg); 
} 

Otros sintaxis es posible:

loggerText.ForeColor = c.GetValueOrDefault(Color.Black); 
+3

También puede usar 'por defecto (color)' como un valor por defecto - pero a veces esto puede hacer que sea imposible diferenciar un valor por defecto de un valor de parámetro válido. Nullable tiende a ser mejor en este caso. – LBushkin

+0

@Bushkin: estoy totalmente de acuerdo con esto! – Simon

+0

thx .. resolví mi problema con el color. +1 – kplshrm7

8

se puede comprobar si el color es Color.Empty (que es el valor por defecto: default(Color)) o utilizar un valor anulable y comprobar NULL.

public void log(String msg, Color? c = null) { ... } 
3

No especifique el color. Suministre un "nivel de error" en su lugar, y tenga una asignación entre cada nivel de error y un valor de color. De esta forma, 0 y abajo podrían ser negras, luego 1 = ámbar,> 2 = rojo. No necesita preocuparse por los valores predeterminados y/o no especificar un valor.

+0

+1 Enfatizar el qué, no el cómo. –

+2

Totalmente en desacuerdo: además de no responder la pregunta, esto introduce un nuevo "nivel de error" semántico que hace que este método sea menos útil en diferentes aplicaciones (¿qué pasa si quiero que las advertencias sean de color naranja en una aplicación y amarillas en otra)? – Justicle

+0

@Justicle: ¿Hojas de estilo? – sisve

0

Uso sugerencia:

public GraphicsLine(Point startPoint, Point endPoint, Color? color = null, double width = 1.0) 
{ 
    StartPoint = startPoint; 
    EndPoint = endPoint; 
    Color = color ?? Colors.Black; 
    Width = width; 
} 
+0

Color.Black, no Colors.Black – Emanuele

Cuestiones relacionadas