我想做这样的事情,但我不能:
[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
这样做是为了什么?
我想做这样的事情,但我不能:
[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] 枚举可以包含标志的组合。转换组合很少会产生有意义的意义
SomeEnum en = SomeEnum.A | SomeEnum.B;
en <<= 1; //Expect what?
您可以转换为 int,如果您知道自己在做什么,就可以做您喜欢的事情
注意:如果你真的想在SomeEnum
不显式转换的情况下使用,你可以用Pseudo<SomeEnum>
我在这里定义的类型来包装它:Is it possible to wrap integer and call it like integer?
请注意,它实际上是一个概念证明,但您可以从那里看到它是如何工作的
我会说这是因为您“无法将运算符'<<='应用于'SomeEnum'和'int'类型的操作数”。因此,您必须做一些不太优雅的事情,
var en = SomeEnum.A;
en = (SomeEnum)((int)en << 1);
哪个显式进行类型转换,或者,如果您愿意,您可以等待实现<<=
或实现Enum
隐式转换为 int 运算符,这两者似乎都不太可能,这不是应该偶然完成的事情。
您可以编写自己的扩展方法来实现相同的目的,但我认为这需要使用一些反射来处理不同的基本类型Enum