[英]Why can't I base an enum off UInt16?
鑒於以下代碼:
static void Main()
{
Console.WriteLine(typeof(MyEnum).BaseType.FullName);
}
enum MyEnum : ushort
{
One = 1,
Two = 2
}
它輸出System.Enum,這意味着這里的冒號與繼承無關,它只是指定了枚舉的基本類型,對不對?
但是,如果我更改我的代碼如下:
enum MyEnum : UInt16
{
One = 1,
Two = 2
}
我會得到一個編譯錯誤。 為什么? UInt16
和ushort
不一樣嗎?
你是正確的,反射不會報告枚舉繼承基類型,規范稱之為“基礎類型”。 您可以使用Enum.GetUnderlyingType
找到它。
ushort
和System.UInt16
命名的類型完全相同。
但是, enum
的語法不會調用類型。 相反,它需要一組有限的關鍵字來控制基礎類型。 雖然System.UInt16
是有效的基礎類型,但它不是C#語法允許在該位置出現的關鍵字之一。
引用語法 :
枚舉聲明 :
attributes opt enum-modifiers opt
enum
identifier enum-base opt enum-body;
選擇枚舉 :
:
積分型積分型 :
sbyte
byte
short
ushort
int
uint
long
ulong
char
因為枚舉的有效類型被明確指定為整數類型( char
除外)。
枚舉的已批准類型是byte,sbyte,short,ushort,int,uint,long或ulong。
http://msdn.microsoft.com/en-us/library/sbbt4032.aspx
根據內置類型的文檔,人們會期望UInt16
等同於ushort
:
C#類型關鍵字及其別名是可互換的。 例如,您可以使用以下任一聲明聲明整數變量...
http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx
編輯:我已經把這個答案弄亂了幾次並沒有完全掌握正確的答案。 @BenVoight是正確的。 接受的列表是整數類型(除了char
) System.UInt16
與ushort
完全相同,但它不是語法指定的整數類型標識符(僅僅是結構類型)。
這是編譯器錯誤CS1008 ,它幾乎提供了答案。 枚舉的已批准類型 :
枚舉的已批准類型是byte,sbyte,short,ushort,int,uint,long或ulong。
你問題的第一部分是由其他人回答的,但還沒有人解決過第二部分。 除OP以外的其他人已經編輯了第二個問題,我的答案可能不再適用
UInt16
和UInt
不相同, UInt16
是無符號的16位整數, UInt
是無符號的32位整數。 它們的最大值變化很大。
為了完整起見,我將答案包括在內。 第一個問題也是:
The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.
至於為什么?
我的猜測是CLS合規性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.