簡體   English   中英

為什么我不能以ennt關閉UInt16?

[英]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
}

我會得到一個編譯錯誤。 為什么? UInt16ushort不一樣嗎?

你是正確的,反射不會報告枚舉繼承基類型,規范稱之為“基礎類型”。 您可以使用Enum.GetUnderlyingType找到它。

ushortSystem.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是正確的。 接受的列表是整數類型(除了charSystem.UInt16ushort完全相同,但它不是語法指定的整數類型標識符(僅僅是結構類型)。

這是編譯器錯誤CS1008 ,它幾乎提供了答案。 枚舉的已批准類型

枚舉的已批准類型是byte,sbyte,short,ushort,int,uint,long或ulong。

你問題的第一部分是由其他人回答的,但還沒有人解決過第二部分。 除OP以外的其他人已經編輯了第二個問題,我的答案可能不再適用

UInt16UInt不相同, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM