是否有人知道(也许:从何时开始)-=
运算符受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();
}
}
}
答案 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的序数值之间的差异,结果的类型是枚举的基础类型。
我希望你知道你可以为枚举成员定义隐含值,所以如果给它们值x = 5,y = 10,z = 15,你会尝试做z-y,你会得到x。