为什么操作符<<和比;比;在c#中没有实现标志枚举

本文关键字:实现 标志 枚举 操作符 和比 为什么 | 更新日期: 2023-09-27 18:11:22

我想做这样的事情,但是我不能:

[Flags]
enum SomeEnum : int
{ 
 None = 0,
 A,
 B,
 C
}
SomeEnum en = SomeEnum.A;
en <<= 1; //Expect en == SomeEnum.B but I recieve an error here

为什么这样做?

为什么操作符<<和比;比;在c#中没有实现标志枚举

枚举本身不是位字段。枚举的全部意义在于抽象掉任何潜在的值。使用移位运算符意味着知道这些值是什么。

但是,如果您真的想要移位,只需强制转换:

en = (SomeEnum)((int)en << 1);

一个[Flag] enum可以保存多个标志的组合。改变组合很少会产生合理的意义

SomeEnum en = SomeEnum.A | SomeEnum.B;
en <<= 1; //Expect what?

你可以强制转换为整型,如果你知道你在做什么,你可以做你喜欢的事情

注意:如果你真的想使用SomeEnum而不显式强制转换,你可以用我在这里定义的Pseudo<SomeEnum>这样的类型来包装它:是否可以包装整数并将其称为整数?

请注意,这实际上是一个概念的证明,但你可以看到它是如何工作的

我会说这是因为您"不能将操作符'<<='应用于'SomeEnum'和'int'类型的操作数"。所以你必须使用不那么优雅的

var en = SomeEnum.A;
en = (SomeEnum)((int)en << 1);

显式地进行类型转换,或者,如果您愿意,您可以等待<<=实现或Enum隐式转换为int操作符实现,这两种情况似乎都不太可能,这不是应该偶然完成的事情。

您可以编写自己的扩展方法来实现相同的功能,但我认为这需要使用一些反射来处理Enum

的不同基本类型。