2010-09-23 165 views
6

可能重複:
C# int, Int32 and enum's枚舉成員

這可能是一個相當基本/簡單的問題 我創建以下列方式枚舉。

情況1編譯完美。但是案例2會引發錯誤。 以我的理解int和Int32在C#中的含義相同。

案例1

[Flags] 
    public enum MyEnum : int 
    { 
     Red = 0x1, 
     Green = 0x2, 
     Blue = 0x4 
    } 

案例2

[Flags] 
    public enum MyEnum : Int32 
    { 
     Red = 0x1, 
     Green = 0x2, 
     Blue = 0x4 
    } 

這裏有什麼區別,爲什麼當枚舉成員被指定爲的Int32類型的C#不編譯代碼?

+1

重複:http://stackoverflow.com/questions/1813408/c-int-int32-and-enums – 2010-09-23 00:50:38

+0

有趣...我認爲int和Int32完全等同於編譯器,但顯然並非如此 – 2010-09-23 00:50:55

+1

它們甚至沒有接近,'int'是一個關鍵字,'Int32'是一個普通的標識符,它恰好是'System'命名空間中定義的基本類型的非限定名稱。因此,例如,我可以創建一個類MyNamespace.Int32,但是MyNamespace.int是一個語法錯誤。 – 2010-09-23 00:53:50

回答

14

a Microsoft bug report here

症狀
如果使用System.Int16 /的Int32/Int64的,而不是短/ INT /長宣佈枚舉,它會得到編譯錯誤。

根本原因
它是由設計。在Enum聲明中完全需要使用值類型別名。

它是「按設計」。

  1. 語法無誤。 C#規範明確指出枚舉的基礎類型必須是byte,sbyte,short,ushort,int,uint,long或ulong。

  2. 儘管「Short」和「System.Int16」的基礎類型是同一個類型,但它們並不像您所假設的那樣相同。 System.Int16是一個類型,Short是一個類型關鍵字。

  3. ValueType是密封的。您不能從任何派生自System.ValueType的類繼承。

  4. 但是,它允許您使用關鍵字來控制。目的是防止在聲明其他類型時使用從System.ValueType派生的任何類型的名稱。最初的意圖是提供一個嚴格控制的機制,允許您聲明從System.ValueType繼承的類型。 但是,MSDN說「C#類型關鍵字及其別名是可以互換的」,這經常會讓客戶感到困惑/莫名其妙。他們認爲這是一個編譯器或語法錯誤。

業務影響/客戶體驗
由於「短」和「System.Int16」是相同的一個基礎類型,可以是互換的,很多客戶感到困惑/莫名其妙,爲什麼不能在枚舉聲明互換。他們認爲這是一個編譯器或語法錯誤。 客戶的聲音: 這聽起來像一個小編譯器錯誤(小,因爲它很容易解決)。 這是MSDN所說的「C#類型關鍵字及其別名是可以互換的。「 在我看來,這是一個真實但很小的編譯器(或者可能是語法)bug。 編譯器讓你在這裏使用」short「而不是」System.Int16「的事實是編譯器的怪癖(可能不是錯誤,但一個怪癖)。

+5

...「短」不是關鍵字(在C#中)。 C#是一個區分大小寫的語言。爲什麼編寫錯誤報告時人們如此sl?? – 2010-09-23 00:52:06

+0

哈哈是的,我甚至沒有注意到這一點。 – 2010-09-23 00:52:36