为什么运营商<<和>>没有实现C#中的标志枚举?

时间:2011-10-17 10:19:16

标签: c# .net enums enum-flags

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

[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

为了做到这一点?

3 个答案:

答案 0 :(得分:6)

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

但是,如果你真的想转变,只需施放:

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

答案 1 :(得分: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?

请注意,它确实是一个概念验证的东西,但你可以从那里看到它是如何工作的

答案 2 :(得分:0)

我想说这是因为你“不能将运算符'&lt;&lt;&lt; ='应用于'SomeEnum'和'int'类型的操作数。”所以相反,你必须做的不那么优雅,

var en = SomeEnum.A;

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

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

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

相关问题