我可以在C#4.0中指定默认的Color参数吗?

时间:2010-12-15 20:03:34

标签: c# parameters c#-4.0 colors default-value

这是一个示例函数:

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 个答案:

答案 0 :(得分:14)

这样做:

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是一个值类型,因此永远不会为null,但最好是在代码样式中保持一致,尤其是零额外成本。显然,这不适用于int甚至DateTime等基元,其中==清楚地表明/传达数学相等比较。

或者,对于nullables(感谢Brian Ball的回答):

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

  // ...
}

答案 1 :(得分:13)

Color.Black是静态的,不是常数,所以不,你不能这样做。

要使用默认值,可以使参数为nullable(Color?),如果为null,则将其设置为Black。

答案 2 :(得分:11)

保持简单有什么不对?

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

public void DrawSquare(int x, int y, Color color)
{
   // Do your thing.
}