为什么枚举上有new()运算符?

时间:2014-10-14 07:17:00

标签: c# enums .net-3.5 new-operator enumeration

我刚刚发现(错误地)枚举有一个新的运算符。鉴于以下

enum fruit {
    apple,
    orange,
    banana,
};

public void Grow() {       
    var item = new fruit(); //will give an apple
}

这样的构造函数的原因是什么?我希望能够使用枚举只是为了从集合中获得定义良好的值。一个错误使用的新操作员只是给我造成了一个奇怪的,难以察觉的错误。

3 个答案:

答案 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”关键字来创建枚举类型,这是一种值类型并在堆栈上创建。