枚举和减法运算符

Wil*_*mpt 16 c# enums

有没有人知道(也许:从什么时候开始)-=运营商支持enum价值观?

今天我很乐意编写代码,因为我出于某种原因写了这个以从标志中排除一个值enum:

flags -= FlagsEnum.Value1;
Run Code Online (Sandbox Code Playgroud)

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

将陈述写为

flags = flags - FlagsEnum.Value1
Run Code Online (Sandbox Code Playgroud)

但也不能编译.

到目前为止,我在文档和互联网上找不到任何内容.此外,不支持其他运算符(当然除了位运算符):( +=包括标志),*=(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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 25

Iirc,-仍然是整数减法.

要做排除,你想要:

value = value & ~SomeEnum.Flag;
Run Code Online (Sandbox Code Playgroud)

包含:

value = value | SomeEnum.Flag;
Run Code Online (Sandbox Code Playgroud)

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

if((value & SomeEnum.Flag) != 0) {...}
Run Code Online (Sandbox Code Playgroud)

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

if((value & SomeEnum.Flag) == SomeEnum.Flag) {...}
Run Code Online (Sandbox Code Playgroud)

  • @Willem - 你错过了我的观点; 你宣称"它有效"; 规范说这是整数子.这不是你想删除的一点(问题).所以IMO这**不会以你的想法(问题)工作. (3认同)
  • 谁投了反对票?`& (~flag)` 是移除标志的正确技术,`| (flag)` 用于添加它们,而 `&` 用于交集。 (2认同)
  • @Willem - 底层类型可能是短/字节吗?如果是这样,他们的 - 总是返回 int,所以需要额外的转换才能回到底层类型;-= 有特殊处理不需要演员表 (2认同)

Sil*_*ilx 7

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

资源

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