枚举和减法运算符

时间:2011-03-12 18:30:26

标签: c# enums

是否有人知道(也许:从何时开始)-=运算符受enum值支持?

当我出于某种原因写了这个以从标志enum中排除一个值时,我今天开心地编写了代码:

flags -= FlagsEnum.Value1;

在重新阅读并评估我的代码之后,我很惊讶它编译实际上有效。

将语句写为

flags = flags - FlagsEnum.Value1

然而 编译。

到目前为止,我在文档和互联网上找不到任何内容。此外,不支持其他运算符(当然除了位运算符):+=(包括标志),*=(Pascal中的交集)不起作用。

这是一些内置于C#编译器的语法糖吗?如果是这样,他们选择不包括其他运营商的原因是什么?

一个简单的代码示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    [Flags]
    enum FlagsEnum
    {
        None = 0,
        Value1 = 1,
        Value2 = 2,
        Value3 = 4
    }

    class Program
    {
        static void Main(string[] args)
        {
            FlagsEnum flags = FlagsEnum.Value1 | FlagsEnum.Value2 | FlagsEnum.Value3;
            Console.WriteLine(flags);
            flags -= FlagsEnum.Value1;
            Console.WriteLine(flags);
            flags -= FlagsEnum.Value3;
            Console.WriteLine(flags);
            flags -= FlagsEnum.Value2;
            Console.WriteLine(flags);
            Console.ReadLine();
        }
    }
}

2 个答案:

答案 0 :(得分:24)

Iirc,-仍然是整数减法。

要进行排除,您需要:

value = value & ~SomeEnum.Flag;

并包含:

value = value | SomeEnum.Flag;

同样,要测试部分匹配(来自Flag的任何位):

if((value & SomeEnum.Flag) != 0) {...}

或完全匹配(Flag中的所有位):

if((value & SomeEnum.Flag) == SomeEnum.Flag) {...}

答案 1 :(得分:7)

枚举减法。每个枚举类型都隐式提供以下预定义运算符,其中E是枚举类型,U是E的基础类型: U运算符 - (E x,E y); 该运算符完全被评估为(U)((U)x - (U)y)。换句话说,运算符计算x和y的序数值之间的差异,结果的类型是枚举的基础类型。

source

我希望你知道你可以为枚举成员定义隐含值,所以如果给它们值x = 5,y = 10,z = 15,你会尝试做z-y,你会得到x。