为什么操作符<<和比;比;在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
为什么这样做?
枚举本身不是位字段。枚举的全部意义在于抽象掉任何潜在的值。使用移位运算符意味着知道这些值是什么。
但是,如果您真的想要移位,只需强制转换:
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