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

    } 

Это приводит к ошибке, которая должна быть константой времени компиляции. Я читал об этом немного, и большинство примеров имеют дело со строками и ints. Я понял, что могу использовать класс colorconverter, но я не уверен, что он будет очень эффективным. Есть ли способ просто передать базовый цвет в качестве необязательного параметра?C# 4.0: Можно ли использовать цвет как необязательный параметр со значением по умолчанию?

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

ответ

83

Я столкнулся с этим, и единственным обходным решением, которое я нашел, является использование nullables.

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

Другой возможный синтаксис:

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

Вы также можете использовать 'по умолчанию (цвет)' в качестве значения по умолчанию - но иногда это может сделать его невозможно отличить значение по умолчанию от действительного значения параметра. В этом случае, как правило, Nullable лучше. – LBushkin

+0

@ Бушкин: Я полностью согласен с этим! – Simon

+0

thx .. решен проблема с цветом. +1 – kplshrm7

8

Вы можете проверить, если Цвет Color.Empty (который является значением по умолчанию: default(Color)) или использовать обнуляемое значение и проверить нуль.

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

Не указывайте цвет. Вместо этого укажите «уровень ошибки» и сопоставьте между каждым уровнем ошибки и значением цвета. Таким образом, 0 и ниже может быть черным, затем 1 = янтарный,> 2 = красный. Не нужно беспокоиться о значениях по умолчанию и/или не указывать значение.

+0

+1 Подчеркните, что, а не как. –

+2

Полностью не согласен - помимо ответа на вопрос, это вводит новый семантический «уровень ошибки», который затем делает этот метод менее полезным для разных приложений (что, если я хочу, чтобы предупреждения были оранжевыми в одном приложении и желтыми в другом). – Justicle

+0

@ Жюри: стили? – sisve

0

Использование предложение:

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, а не Colors.Black – Emanuele

Смежные вопросы