C# 枚举加减和强制转换

C# 枚举加减和强制转换,c#,.net,.net-4.0,enums,C#,.net,.net 4.0,Enums,为什么加法需要石膏,而减法不需要石膏?请参阅下面的代码以了解我的要求 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

为什么加法需要石膏,而减法不需要石膏?请参阅下面的代码以了解我的要求

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)
U operator -(E x, E y)
在运行时,这些操作符被精确地评估为(E)((U)x+(U)y)

第7.8.5节:

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

E operator +(E x, U y)
E operator +(U x, E y)
U operator -(E x, E y)
此运算符的求值方式为
(U)((U)x-(U)y))
。换句话说,运算符计算
x
y
的序数值之间的差值,结果的类型是枚举的基本类型

E operator -(E x, U y);
此运算符的计算结果与
(E)((U)x-y)
完全相同。换句话说,运算符从枚举的基础类型中减去一个值,从而生成枚举的值

E operator -(E x, U y);
这就是为什么编译器的行为是这样的——因为这就是C规范所说的:)

我不知道这些操作符中有任何一个存在,我也从来没有在知情的情况下看到它们被使用过。我怀疑它们存在的原因隐藏在Eric Lippert偶尔会深入研究的语言设计会议记录中,但如果他们后悔添加功能没有什么好处,我也不会感到惊讶。再说一次,也许它们在某些情况下真的很有用:)

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

枚举的默认值是0,1,2。。。因此,在本例中,两个枚举之间的差异将创建另一个枚举(首先比较它们,以确保从较大的枚举中减去较小的枚举)


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

我想说“因为枚举的算术规则很奇怪”,但我想我会等着看是否有人能给出真正的解释。你能告诉我们它在不编译时给你带来的错误吗?