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

    } 

Ciò genera un errore che c deve essere una costante in fase di compilazione. Ho letto un po 'su questo argomento e molti esempi hanno a che fare con stringhe e intarsi. Ho capito che posso usare la classe colorconverter ma non sono sicuro che sarà molto efficiente. C'è un modo per passare semplicemente un colore di base come parametro opzionale?C# 4.0: Posso usare un Colore come parametro opzionale con un valore predefinito?

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

risposta

83

Ho eseguito in questo come bene e l'unica soluzione che ho trovato è quello di utilizzare nullables.

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

Altra sintassi possibile è:

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

È inoltre possibile utilizzare 'default (a colori)' come valore di default - ma a volte questo può comportare l'impossibilità di distinguere un valore predefinito da un valore di parametro valido. Nullabile tende ad essere migliore in questo caso. – LBushkin

+0

@Bushkin: sono assolutamente d'accordo! – Simon

+0

thx .. risolto il mio problema con il colore. +1 – kplshrm7

8

Si potrebbe verificare se il colore è Color.Empty (che è il valore di default: default(Color)) o utilizzare un valore Null e verificare la presenza di null.

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

Non specificare il colore. Fornire invece un "livello di errore" e avere una mappatura tra ogni livello di errore e un valore di colore. In questo modo 0 e sotto potrebbe essere nero, quindi 1 = ambra,> 2 = rosso. Non c'è bisogno di preoccuparsi dei valori di default e/o di non specificare un valore.

+0

+1 Enfatizza il cosa, non il come. –

+2

Completamente in disaccordo - oltre a non rispondere alla domanda, questo introduce un nuovo "livello di errore" semantico che rende quindi questo metodo meno utile tra le diverse applicazioni (cosa succede se voglio che gli avvertimenti siano arancioni in una applicazione e gialli in un'altra). – Justicle

+0

@Justicle: fogli di stile? – sisve

0

suggerimento Usage:

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, non Colors.Black – Emanuele

Problemi correlati