2014-09-23 102 views
1

我想宣布在C#这样的挣扎(注意,这是不正确的C#语法):用C#泛型HashSet的声明

enum Color { Red, Yellow, Green, Blue } 
type ColorSet HashSet<Color>;      // #1 

void setColors (ColorSet colors = { Red, Green }) // #2 
{ ... } 

所以 - 我怎么可以声明的代名词类型的HashSet,以及如何定义该类型的常量以使用例如作为函数参数的默认值?

#1,一种可能的方法是一个空的包装类:

class ColorSet : HashSet<Color> { } 

- 但如何定义类的常量?

在此先感谢。

+1

它是什么,你实际上是试图*做*这里? – 2014-09-23 10:15:07

+0

Marc Gravell:正如我写的:我想为“颜色集”使用单一类型的名称,因为它被多次使用,例如,作为函数参数。为了定义参数的默认值,我需要一个常量定义或文字。 – Stefan 2014-09-23 12:52:40

+0

你可以使用的唯一常量是'null'。 – 2014-09-23 13:02:02

回答

2

你可以试试这个方法:

public enum Color { Red, Yellow, Green, Blue }  
public class ColorSet : HashSet<Color> {} 

private void setColors(ColorSet colors = null) 
{ 
    if (colors == null) 
     colors = new ColorSet {Color.Red, Color.Green}; 

    .... 
} 

注意,C#编译器要求方法的默认参数是comile时间defiite,所以你不能使用ColorSet的任何静态实例作为方法的默认参数。相反,假设null是默认参数,在这种情况下,请使用方法体中需要的预定义颜色集。

2

我怎么能声明的代名词类型的HashSet,

你不能;在C#中没有这样的事情。有一个using别名,但这是每个文件。

以及如何定义该类型的常量以使用例如作为函数参数的默认值?

你不能:一个类不能是常量(除了string文字)。某个地方可能有static readonly字段,但它可能是可变的。

2

不能直接设定为引用类型的方法(NOT NULL)默认值,但您可以创建两个方法,其作用类似:

enum Color { Red, Yellow, Green, Blue } 
class ColorSet : HashSet<Color> { } 

void setColors(ColorSet colors) 
{ 
    ... 
} 
void setColors() 
{ 
    setColors(new ColorSet { Color.Red, Color.Green }); 
} 
+0

我认为,您的解决方案和Andy的功能同样有用。 :-) – Stefan 2014-09-23 12:56:34