我刚刚发现(错误地)枚举有一个新的运算符。鉴于以下
enum fruit {
apple,
orange,
banana,
};
public void Grow() {
var item = new fruit(); //will give an apple
}
这样的构造函数的原因是什么?我希望能够使用枚举只是为了从集合中获得定义良好的值。一个错误使用的新操作员只是给我造成了一个奇怪的,难以察觉的错误。
答案 0 :(得分:1)
所有值类型必须具有公共无参数构造函数(基本上将实例初始化为全零位模式,如果没有被覆盖),因此new()
不是' t仅出现在enum
s;它也存在,例如在int
。
我不确定这是否是技术上正确的原因,但我认为值类型需要具有默认构造函数,因为它是值类型字段,最终构成对象的有效负载,而C#想要保证对象始终初始化为确定的,理智的默认状态。所以,让我们说你有这个:
class C { private int i; … }
您不必显式初始化i
(不在此处,也不在构造函数中)。不显式初始化字段与将其初始化为private int i = new int();
具有相同的结果。如果不是这样,i
最初可能包含任何随机值,这不是一个非常理智,有用的默认值。
答案 1 :(得分:1)
enum
关键字定义了一个新的值类型(示例中为fruit
)。
作为任何值类型,它都有一个默认构造函数(这至少在语言规范中描述,第4.1.2节“默认构造函数”)。构造函数行为也是可预测的,因为它将枚举实例初始化为其默认值 - 0(在您的情况下为apple
)。
这里没有任何错误或错误。
答案 2 :(得分:1)
使用“new”关键字可以调用枚举的构造函数,在这种情况下,这可能是默认构造函数。对于枚举,您不一定需要“new”关键字来创建枚举类型,这是一种值类型并在堆栈上创建。