【问题标题】:C++/CLI : Casting from unmanaged enum to managed enumC++/CLI:从非托管枚举转换为托管枚举
【发布时间】:2009-12-09 11:38:49
【问题描述】:

从本机代码enum 转换为包含相同enum 值的托管代码enum 的正确方法是什么?在 C++/CLI 中使用诸如 (int) 之类的 C# 转换方式有什么不同吗?

【问题讨论】:

    标签: enums casting c++-cli native managed


    【解决方案1】:

    假设您的本机代码是

    enum shape_type_e
    {
        stUNHANDLED     = 0,            //!< Unhandled shape data.
        stPOINT         = 1             //!< Point data.
        ...
    };
    

    您的托管代码是

    public enum class ShapeType
    {
        Unhandled   = 0,
        Point       = 1,
        ...
    };
    

    您可以使用从本机投射到托管

    shape_type_e nativeST = stPOINT;
    ShapeType managedST = static_cast<ShapeType>(nativeST);
    Debug.Assert(managedST == ShapeType::Point);
    

    我总是使用static_cast,而不是 C# 的转换方式。

    【讨论】:

    • 从上面的代码中,我想你正在从本地转换为托管枚举。从托管到原生的反过来呢?
    • 静态演员是你的朋友... nativeST = static_cast(managedST);
    • 根据您对@Lopper 的评论,您能否更改答案中的文本以澄清该示例正在演示本机到托管(而不是当前状态的相反方式)。
    【解决方案2】:

    这取决于。例如,如果您有一个底层类型为 ushort 的 CLI 枚举,它不能保存 257 的值。默认情况下,CLI 枚举基于 int,这在大多数情况下应该没问题。如果您的本机 C++ 代码使用无符号 32 位整数/64 位整数作为枚举的基础类型,请将 CLI 枚举的基数切换为 UInt32、long 或 ulong。

    【讨论】:

    • 我不会遇到这个问题,因为两个枚举都是 int 类型。但是在这种情况下应该使用哪种类型的演员表?应该是 const_cast、static_cast、dynamic_cast、reinterpret_cast、safe_cast 还是只是 C# 类型转换(例如 (int))?
    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多