2010-12-15 62 views
15

下面是一个例子功能:我可以在C#4.0中指定默认的颜色参数吗?

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值。

回答

11

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

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

+0

我已经在我的答案,但如果你要指定一个空参数,为什么不只是指定Color.Black? :) – 2010-12-15 20:12:45

+0

@George:“Color.Black是一个静态的,而不是一个常量”。 – Vlad 2010-12-15 20:13:27

+0

颜色是一个结构体,所以如果您要使用Nullable 作为类型(或简称为C#Color?),则它可以为null。 – 2010-12-15 20:19:23

11

这样做:

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

    // ... 
} 
+0

为什么不只是'if(boxColor == default(Color))'? – Vlad 2010-12-15 20:11:37

+0

它没有区别。我更喜欢Equals符号,但是值类型,'=='是相同的。 – 2010-12-15 20:17:16

+0

@Mr。 TA:好吧,在这种情况下,最好使用'Color.Equals'而不是'object.Equals'。或者更好'默认(Color).Equals(boxColor)',以便使用虚函数。在我看来,'=='更具可读性,但这是个人品味的问题。 – Vlad 2010-12-15 20:32:11

9

这有什么错保持简单?

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

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

实际功能并不那么简单。它有大约10个参数(其中大多数是可选的,可以指定为可选)。此外,这些参数有5或6种不同的功能,每种功能有两种不同的功能。要做到这一点会增加太多的功能。不过谢谢你的建议。 – 2010-12-15 20:15:21

相关问题