Могу ли я указать параметр цвета по умолчанию в C # 4.0? - PullRequest
18 голосов
/ 15 декабря 2010

Вот пример функции:

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

Компилятор постоянно выдает ошибку: Default parameter value for 'boxColor'must be a compile-time constant

Я пытался

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

Как сделать Color.Black цветным по умолчанию? Кроме того, я не хочу использовать строку Black для ее указания (что, я знаю, будет работать). Я хочу значение Color.Black.

Ответы [ 3 ]

14 голосов
/ 15 декабря 2010

Сделайте это:

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

  // ...
}

В сторону: мне нравится использовать object.Equals статический метод, потому что это последовательный способ написать сравнение на равенство. С ссылочными типами, такими как string, str.Equals("abc") может выдавать NRE, тогда как string.Equals(str, "abc"[,StringComparison.___]) - нет. Color является типом значения и поэтому никогда не будет нулевым, но лучше быть последовательным в стиле кода, особенно при нулевых дополнительных затратах. Очевидно, что это не относится к примитивам, таким как int и даже DateTime, где == ясно заявляет / сообщает сравнение математического равенства.

Или со значением nullables (благодарность ответу Брайана Болла):

void foo(... Color? boxColor = null)
{
   if(boxColor == null) boxColor = Color.Black;

  // ...
}
13 голосов
/ 15 декабря 2010

Color.Black является статическим, а не постоянным, поэтому нет, вы не можете сделать это.

Чтобы использовать значение по умолчанию, вы можете сделать параметр обнуляемым (Color?), а если он равен нулю, установить для него значение Black.

11 голосов
/ 15 декабря 2010

Что плохого в том, чтобы все было просто?

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

public void DrawSquare(int x, int y, Color color)
{
   // Do your thing.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...