2011-04-07 609 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