为什么枚举上有一个new()运算符
本文关键字:运算符 new 有一个 枚举 为什么 | 更新日期: 2023-09-27 18:26:22
我刚刚(错误地)发现枚举有一个新的运算符。给定以下
enum fruit {
apple,
orange,
banana,
};
public void Grow() {
var item = new fruit(); //will give an apple
}
创建这样一个构造函数的原因是什么我希望能够使用枚举来获得一个定义良好的值。一个错误使用的新运算符给我带来了一个奇怪的、几乎无法察觉的错误。
enum
关键字定义了一个新的值类型(示例中的fruit
)。
作为任何值类型,它都有一个默认构造函数(这至少在语言规范第4.1.2段"默认构造函数"中有描述)。构造函数的行为也是可预测的,因为它将枚举实例初始化为默认值-0(在您的情况下为apple
)。
这里没有任何错误。
所有值类型都必须有一个公共的无参数构造函数(如果不重写,它基本上将实例初始化为全零位模式),因此new()
不仅存在于enum
s;它也存在于例如CCD_ 6上。
我不确定这是否是技术上正确的原因,但我认为值类型需要有一个默认构造函数,因为它是值类型字段,最终构成了对象的有效负载,而C#希望向您保证,对象总是初始化为一个确定的、正常的默认状态。假设你有这个:
class C { private int i; … }
您不必显式初始化i
(不在这里,也不在构造函数中)。不显式初始化字段的结果与将其初始化为private int i = new int();
的结果相同。如果不是这样,i
最初可能包含任何随机值,这将不是一个非常合理、有用的默认值。
使用"new"关键字调用枚举的构造函数,在这种情况下,这可能是默认的构造函数。对于枚举,您不一定需要"new"-关键字来创建枚举类型,它是在堆栈上创建的值类型。