.net Enums是否存在blittable类型? (编组)

时间:2011-04-07 16:11:17

标签: .net enums pinvoke marshalling

显然有一个blittable类型的列表,到目前为止,我没有专门看到它的枚举。他们一般都是快乐的吗?或者它取决于它们是否以blittable基类型声明?

//e.g.
internal enum SERVERCALL : uint
{
    IsHandled = 0,
    Rejected = 1,
    RetryLater = 2,
}

参考资料已用完:

4 个答案:

答案 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 )文档存在缺陷;该页面甚至没有在可能的例外列表中包含ArgumentExceptionMarshal.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());

实际上第一个调用了第二个...