枚举加法与减法和铸造

lah*_*rah 28 .net c# enums .net-4.0

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

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     
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 19

好问题 - 我很惊讶第一和第三线工作.

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

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

E operator +(E x, U y)
E operator +(U x, E y)
Run Code Online (Sandbox Code Playgroud)

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

在第7.8.5节中:

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

U operator -(E x, E y)
Run Code Online (Sandbox Code Playgroud)

该运算符的评估完全如下(U)((U)x - (U)y)).换句话说,操作者计算的序值之间的差xy,并且将结果的类型是基础类型枚举的.

E operator -(E x, U y);
Run Code Online (Sandbox Code Playgroud)

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

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

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