2011-03-12 101 views
15

有誰知道enum值是否支持-=運算符?枚舉和減法運算符

我愉快地進行編碼就能今天,當我出於某種原因,寫這從一個標誌enum排除值:

flags -= FlagsEnum.Value1; 

重讀和評價我的代碼後,我很驚訝,它編譯的實際工作。

寫作語句

flags = flags - FlagsEnum.Value1 

但是確實編譯。

到目前爲止我在文檔和互聯網上都找不到任何東西。此外,其他操作員(當然除了位操作員)不支持:+=(包括一個標誌),*=(Pascal中的交叉點)不起作用。

這是C#編譯器內置的一些語法糖嗎?如果是這樣,他們爲什麼選擇不包括其他運營商?

一個簡單的代碼示例:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication4 
{ 
    [Flags] 
    enum FlagsEnum 
    { 
     None = 0, 
     Value1 = 1, 
     Value2 = 2, 
     Value3 = 4 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      FlagsEnum flags = FlagsEnum.Value1 | FlagsEnum.Value2 | FlagsEnum.Value3; 
      Console.WriteLine(flags); 
      flags -= FlagsEnum.Value1; 
      Console.WriteLine(flags); 
      flags -= FlagsEnum.Value3; 
      Console.WriteLine(flags); 
      flags -= FlagsEnum.Value2; 
      Console.WriteLine(flags); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

你確定它確實有效嗎?你可能被欺騙的事實,減法會出現排除位。你有沒有試過它在一個標誌變量的位對應的Value1已經是0? – Tormod 2011-03-12 18:36:03

+0

像這樣使用它是非常不安全的。當'FlagsEnum.Value1'已經在'flags'中時它只能作爲enum使用。 – 2011-03-12 18:49:57

+0

@Jaroslav:我從來沒有這樣做過,但它恰好是從我的手指中滾出來的。我把它歸咎於德爾福(以其優秀的集合運算符),但我相當(雖然現在更少)驚訝於它編譯。而且,正如Marc所指出的那樣,結果可能不是你期望的結果。 – 2011-03-12 18:58:09

回答

6

枚舉減法。每種枚舉類型都隱含地提供了以下預定義的操作符,其中E是枚舉類型,U是E的基礎類型:U操作符 - (E x,E y); 該運算符的計算方式與(U)((U)x - (U)y)完全相同。換句話說,運算符計算x和y的序數值之間的差異,並且結果的類型是枚舉的基礎類型。

source

我希望你知道,你可以定義枚舉成員的隱含價值,因此,如果你給他們值x = 5,y = 10,Z = 15,你會嘗試做ZY,你會得到x。

+0

啊......規格。 :)唯一的地方我沒有看(幾乎從不看,說實話)。謝謝。任何想法爲什麼+ =運算符沒有以類似的方式定義枚舉? – 2011-03-12 18:43:20

+0

嗯,我還是不知道'E - = E'是如何編譯的,'E = E - E'沒有... – digEmAll 2011-03-12 18:48:43

+0

@digEmAll:該死......仍然是一個謎...... – 2011-03-12 18:58:54

21

Iirc,-仍然是整數減法。

要做到排除你想:

value = value & ~SomeEnum.Flag; 

和包容:

value = value | SomeEnum.Flag; 

同樣,以測試部分匹配(從標誌的任何位):

if((value & SomeEnum.Flag) != 0) {...} 

或者完全匹配(Flag中的所有位):

​​
+1

誰降低了這個數? '&(〜標誌)'是刪除標誌的正確方法,'| (標誌)'用於添加它們,'&'用於相交。 – 2011-03-12 18:41:51

+0

是的,這是「正常」的方式。因此我的問題。 – 2011-03-12 18:42:20

+0

@Marc:我知道*枚舉是如何工作的。這就是爲什麼我首先提出這個問題的原因。 – 2011-03-12 18:46:06