簡體   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