1

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

[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

这样做是为了什么?

4

3 回答 3

6

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

但是,如果你真的想改变,只需投射:

en = (SomeEnum)((int)en << 1);
于 2011-10-17T10:29:36.277 回答
2

[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?

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

于 2011-10-17T10:34:54.417 回答
0

我会说这是因为您“无法将运算符'<<='应用于'SomeEnum'和'int'类型的操作数”。因此,您必须做一些不太优雅的事情,

var en = SomeEnum.A;

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

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

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

于 2011-10-17T10:42:23.237 回答