显然有一个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