显然有一个blittable类型的列表,到目前为止,我没有专门看到它的枚举。他们一般都是快乐的吗?或者它取决于它们是否以blittable基类型声明?
//e.g.
internal enum SERVERCALL : uint
{
IsHandled = 0,
Rejected = 1,
RetryLater = 2,
}
参考资料已用完:
答案 0 :(得分:4)
枚举是blittable类型。来自enum
keyword documentation:
每个枚举类型都有一个 基础类型,可以是任何类型 除了char之外的整数类型。
因为底层类型是完整的(所有这些都在blittable类型列表中),所以enum也是blittable。
答案 1 :(得分:3)
枚举类型本身不是blittable(因为它们在非托管世界中没有对应物)但值是。
答案 2 :(得分:3)
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的文档使 no 完全无法提及是否枚举值是直接blittable。)
答案 3 :(得分:0)
代替
int enumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(ConsoleColor)));
你可以写
int enumSize = Marshal.SizeOf(typeof(ConsoleColor).GetEnumUnderlyingType());
实际上第一个调用了第二个...