2011-04-07 62 views

回答

3

枚舉是Blittable型。從enum keyword documentation

每個枚舉類型具有 基本類型,其可以是除炭任何 整數類型。

因爲基礎類型是整數(所有這些都在blittable類型的列表中),所以enum也是blittable。

+0

啊,竟然長。優秀。 – 2011-04-07 17:46:53

3

枚舉類型自己沒有blittable(因爲他們沒有在不可控制的世界副本),但是。

+0

這應該是答案。 – rick 2017-08-09 20:43:01

2

Aliostad是正確的。例如,如果試圖向執行語句:

int size = Marshal.SizeOf(System.ConsoleColor.Red); 

然後將引發ArgumentException,與消息:

類型「System.ConsoleColor」不能被編組爲不接受管理結構;無法計算出有意義的大小或偏移量。

然而,聲明:

int size = Marshal.SizeOf((int)System.ConsoleColor.Red); 

作品就好正如人們所期望的那樣。

同樣,聲明:

int enumSize = Marshal.SizeOf(typeof(ConsoleColor)); 

失敗,但聲明:

int enumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(ConsoleColor))); 

成功。

不幸的是,微軟關於Marshal.SizeOf(object)的文檔是有缺陷的;該頁面甚至不包括ArgumentException在可能的例外列表中。 Marshal.SizeOf(Type)的文檔列出了ArgumentException,但只是說它在類型是通用時拋出(這是事實,但不包括上述示例)。

(同樣,C#編程指南中的說明文件enum關鍵字,則Enum類,並Enumeration Types使得沒有提及的所有關於枚舉值是否是直接blittable。)

+0

有趣的答案,但我不確定你是否證明了enum是blittable或不,你所證明的是,Marshal.SizeOf不喜歡枚舉? – 2013-06-07 22:49:29

+0

有趣的是,這個作品: [序列化] 公共枚舉MyConsoleColor:整數 { 白色= 0, 紅色= 1, 綠色= 2, } [StructLayout(LayoutKind.Sequential)] 公共結構MYSTRUCT { public MyConsoleColor c; } static void Main(string [] args) {t1} Marshal.SizeOf(typeof(MyStruct)); int t2 = Marshal.SizeOf(new MyStruct {c = MyConsoleColor.White}); } – 2013-06-07 22:49:50