顯然有一個blittable類型的列表,到目前爲止我沒有看到具體的Enums。他們一般都可以接受嗎?或者是否依賴於它們是否使用blittable基類型進行聲明?.net枚舉blittable類型? (編組)
//e.g.
internal enum SERVERCALL : uint
{
IsHandled = 0,
Rejected = 1,
RetryLater = 2,
}
參考耗盡:
顯然有一個blittable類型的列表,到目前爲止我沒有看到具體的Enums。他們一般都可以接受嗎?或者是否依賴於它們是否使用blittable基類型進行聲明?.net枚舉blittable類型? (編組)
//e.g.
internal enum SERVERCALL : uint
{
IsHandled = 0,
Rejected = 1,
RetryLater = 2,
}
參考耗盡:
枚舉是Blittable型。從enum
keyword documentation:
每個枚舉類型具有 基本類型,其可以是除炭任何 整數類型。
因爲基礎類型是整數(所有這些都在blittable類型的列表中),所以enum也是blittable。
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。)
有趣的答案,但我不確定你是否證明了enum是blittable或不,你所證明的是,Marshal.SizeOf不喜歡枚舉? – 2013-06-07 22:49:29
有趣的是,這個作品: [序列化] 公共枚舉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
啊,竟然長。優秀。 – 2011-04-07 17:46:53