枚举加法与减法和铸造

为什么添加需要演员但减法在没有演员表的情况下有效? 请参阅下面的代码以了解我的要求

public enum Stuff { A = 1, B = 2, C = 3 } var resultSub = Stuff.A - Stuff.B; // Compiles var resultAdd = Stuff.A + Stuff.B; // Does not compile var resultAdd2 = (int)Stuff.A + Stuff.B; // Compiles 

注意:对于加法和减法,在上述所有三个例子中,结果是否超出范围(枚举)并不重要。

好问题 – 我对第一和第三线工作感到惊讶。

但是,它们在C#语言规范得到支持 – 在7.8.4节中,它讨论了枚举添加:

每个枚举类型都隐式提供以下预定义运算符,其中E是枚举类型,U是E的基础类型:

 E operator +(E x, U y) E operator +(U x, E y) 

在运行时,这些运算符完全被称为(E)((U)x +(U)y)

在第7.8.5节中:

每个枚举类型隐式提供以下预定义运算符,其中E是枚举类型,U是E的基础类型:

 U operator -(E x, E y) 

该运算符完全被评估为(U)((U)x - (U)y)) 。 换句话说,运算符计算xy的序数值之间的差异,结果的类型是枚举的基础类型。

 E operator -(E x, U y); 

该运算符完全被评估为(E)((U)x - y) 。 换句话说,运算符从枚举的基础类型中减去一个值,产生一个枚举值。

所以这就是编译器行为的原因 – 因为它是C#规范所说的:)

我不知道任何这些运算符存在,我从来没有故意看到它们被使用过。 我怀疑他们存在的原因被隐藏在Eric Lippert偶尔潜入的语言设计会议记录中 – 但是如果他们后悔因为添加function而没有什么好处,我也不会感到惊讶。 然后,也许他们在某些情况下真的很有用:)

枚举的默认值为0,1,2 …所以在这种情况下,两个枚举之间的差异将创建另一个枚举(首先比较它们以确保从较大的中减去较小的枚举)。

添加一半的时间会产生一个太高的值,无法成为有效的枚举。

问题是在这种情况下“+”不是枚举值之间的加号。 重要的是要理解+是运算符,并且没有定义如何将它应用于操作数的规则(Stuff.A和Stuff.B)