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

Mik*_*ebb 19 c# parameters colors default-value c#-4.0

这是一个示例函数:

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

编译器不断给我错误: Default parameter value for 'boxColor'must be a compile-time constant

我试过了

Color.Black, 
Color.FromKnownColor(KnownColor.Black), and 
Color.FromArgb(0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

如何使Color.Black成为默认颜色?另外,我不想使用字符串Black来指定它(我知道它可以工作).我想要的Color.Black价值.

Mr.*_* TA 15

做这个:

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

  // ...
}
Run Code Online (Sandbox Code Playgroud)

快速搁置:我喜欢使用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;

  // ...
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*all 14

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

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


Geo*_*ton 12

保持简单有什么问题?

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

public void DrawSquare(int x, int y, Color color)
{
   // Do your thing.
}
Run Code Online (Sandbox Code Playgroud)

  • 实际功能并没有那么简单。它有大约 10 个参数(其中大部分是可选的,可以指定为可选)。此外,还有 5 或 6 个不同的函数具有这些参数,每个函数有两个变体。这样做会增加太多的功能。不过还是谢谢你的建议。 (2认同)