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

    } 

Powoduje to błąd, że c musi być stałą czasu kompilacji. Czytałem o tym trochę, a większość przykładów dotyczy ciągów i intów. Rozumiem, że mogę używać klasy colorconverter, ale nie jestem pewien, czy będzie to bardzo wydajne. Czy istnieje sposób, aby po prostu przekazać podstawowy kolor jako parametr opcjonalny?C# 4.0: Czy mogę używać koloru jako parametru opcjonalnego z wartością domyślną?

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

Odpowiedz

83

Wpadłem również na to i jedynym rozwiązaniem, które znalazłem, jest użycie nullabli.

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

Inne możliwe Składnia jest następująca:

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

Można również użyć 'default (Kolor)' jako wartość domyślną - ale czasami może to uniemożliwić różnicować wartość domyślną z ważnego parametru. Nullable wydają się być lepsze w tym przypadku. – LBushkin

+0

@Bushkin: Całkowicie się z tym zgadzam! – Simon

+0

thx .. rozwiązałem mój problem z kolorem. +1 – kplshrm7

8

Można sprawdzić, czy kolor jest Color.Empty (która jest wartością domyślną: default(Color)) lub użyć wartości zerowalne i sprawdzić null.

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

Nie określaj koloru. Zamiast tego podaj "poziom błędu" i mapuj między każdym poziomem błędu a wartością koloru. W ten sposób 0 i poniżej mogą być czarne, a następnie 1 = bursztynowy,> 2 = czerwony. Nie musisz martwić się wartościami domyślnymi i/lub nie podawać wartości.

+0

+1 Podkreśl, co, a nie w jaki sposób. –

+2

Całkowicie się nie zgadzam - oprócz braku odpowiedzi na pytanie, wprowadza to nowy semantyczny "poziom błędu", który sprawia, że ​​ta metoda jest mniej przydatna w różnych aplikacjach (co jeśli chcę, by ostrzeżenia były pomarańczowe w jednej aplikacji, a żółte w innym). – Justicle

+0

@Justicle: Arkusze stylów? – sisve

0

Wykorzystanie sugestia:

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

Powiązane problemy