2015-04-01 107 views
-3

在弄亂枚舉的同時,我發現了一個枚舉的奇怪行爲。是什麼導致了這種枚舉的奇怪行爲?

考慮下面的代碼:

static void Main() 
    { 

     Console.WriteLine("Values"); 
     Console.WriteLine(); 
     foreach (Month m in Enum.GetValues(typeof(Month))) 
     { 
      Console.WriteLine(m.ToString()); 
     } 
     Console.WriteLine(); 
     Console.WriteLine("Names"); 
     Console.WriteLine(); 
     foreach (var m in Enum.GetNames(typeof(Month))) 
     { 
      Console.WriteLine(m); 
     } 
     Console.ReadLine(); 
    } 
    public enum Month 
    { 
     January, 
     May, 
     March, 
     April 
    } 

此代碼將產生以下輸出(如預期):

Values 

January 
May 
March 
April 

Names 

January 
May 
March 
April 

現在,可以說我改變一點點我的枚舉,像這樣:

public enum Month 
    { 
     January = 3, 
     May, 
     March, 
     April 
    } 

如果我運行相同的代碼,相同的結果將apear(這是奇怪的,因爲它是)。現在,如果我改變我的枚舉是這樣的:

public enum Month 
    { 
     January = "g", 
     May, 
     March, 
     April 
    } 

我得到以下編譯器錯誤:

無法隱式轉換類型「字符串」到「廉政」。

爲什麼編譯器允許我將enum的值之一設置爲3,但不是g?爲什麼第一個結果與第二個結果完全相同?如果我改變了1月的價值,那麼爲什麼GetValues不打印3?

+0

Enum是整數。當你看到一個單詞'January'時,它的值爲1.(或者你在第二個例子中指定的值爲3)但它不能具有'g'的值。 – paqogomez 2015-04-01 17:31:01

+0

閱讀http://stackoverflow.com/a/16039343/380384看看你可以用'enum'做什麼。 – ja72 2015-04-01 17:35:14

回答

4

默認情況下,枚舉由int支持。它們只是附在各種int值上的標籤。您可以讓編譯器選擇哪個ints來映射每個枚舉值,或者您可以明確地執行它。

int(如bytelong)之外,您還可以創建由其他數字類型支持的枚舉。

的語法是這樣的:

public enum Month : long 
{ 
    January = 50000000000, //note, too big for an int32 
    May, 
    March, 
    April 
} 

你不能有一個非數字類型支持的枚舉,如string

2

這是枚舉如何在C#實現的,它們可以僅僅基於byteintlongshort(和他們的無符號類似物),則不能使用string爲後盾類型。

相關問題