繁体   English   中英

为什么在C#中没有为标志枚举实现运算符<<和>>?

[英]Why operators << and >> are not realized for flag enums in C#?

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

[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>类的类型包装它: 是否可以包装整数并像整数一样调用它?

请注意,这确实是概念证明,但您可以从那里看到它的工作原理。

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

var en = SomeEnum.A;

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

类型转换是显式进行的,或者,如果您愿意,可以等待<<=实现,或者等待Enum隐式强制转换为int运算符的实现,这似乎都不可行,这并不是偶然的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM