[英]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.