【问题标题】:Are .net Enums blittable types? (Marshalling).net Enums 是 blittable 类型吗? (编组)
【发布时间】:2011-04-07 16:11:16
【问题描述】:

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

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

引用已用尽:

【问题讨论】:

    标签: .net enums pinvoke marshalling


    【解决方案1】:

    枚举是 blittable 类型。来自enum keyword documentation

    每个枚举类型都有一个 基础类型,可以是任何 除char以外的整型。

    因为底层类型是整数(所有这些都在 blittable 类型列表中),所以 enum 也是 blittable。

    【讨论】:

      【解决方案2】:

      枚举 types 本身不是 blittable(因为它们在非托管世界中没有对应物),但 values 是。

      【讨论】:

      • 这应该是答案。
      • Nitpick 反建议:枚举类型是 blittable,当其值在托管内存中具有与非托管内存相同的表示时,始终假设您正确定义了基础枚举类型以匹配非托管类型,枚举的实际值也与为非托管代码定义的值匹配。
      • 类型是 blittable 和值是 blittable 之间有什么区别?我想我们应该说一个类型只有当它的大小相同并且它的所有值都是blittable时才是blittable。 IE。托管代码和非托管代码对内存中特定值的解释必须相同。
      【解决方案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) ) );
      

      成功了。

      很遗憾,Microsoft 的 Marshal.SizeOf( object ) 文档不足;该页面甚至没有在可能的例外列表中包含ArgumentExceptionMarshal.SizeOf( Type ) 的文档列出了 ArgumentException,但仅表示当类型为泛型时会抛出它(这是真的,但不包括上面的示例)。

      (此外,C# 编程指南中的 enum 关键字、Enum 类和 Enumeration Types 的文档没有提到枚举值是否可以直接 blittable .)

      【讨论】:

      • 有趣的答案,但我不确定你是否已经证明了枚举是否是 blittable,你所证明的只是 Marshal.SizeOf 不喜欢枚举?
      • 有趣的是,这有效: [Serializable] public enum MyConsoleColor : int { White = 0, Red = 1, Green = 2, } [StructLayout(LayoutKind.Sequential)] public struct MyStruct { public MyConsoleColor c ; } static void Main(string[] args) { int t1 = Marshal.SizeOf(typeof(MyStruct)); int t2 = Marshal.SizeOf(new MyStruct { c = MyConsoleColor.White }); }
      【解决方案4】:

      而不是

      int enumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(ConsoleColor)));
      

      你可以写

      int enumSize = Marshal.SizeOf(typeof(ConsoleColor).GetEnumUnderlyingType());
      

      其实第一个叫第二个……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        • 2016-01-06
        • 1970-01-01
        • 2023-03-19
        • 2017-03-16
        相关资源
        最近更新 更多