C++/CLI:从非托管枚举转换为托管枚举

31

在C++/CLI中,从本地代码enum转换为包含相同enum值的托管代码enum的正确方法是什么?与使用C#转换方式(例如在C++/CLI中使用(int))有什么区别。

2个回答

43

假设您的本地代码是

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#中的转换方式。


2
从上面的代码中,我猜你正在将本机枚举转换为托管枚举。那么从托管到本机的转换呢? - Lopper
7
静态转换在这里是双向的好朋友...nativeST = static_cast(managedST); - mcdave
根据您对@Lopper的评论,您能否更改答案中的文本以澄清示例正在演示本机到托管(而不是当前所述的另一种方式)。 - Glenn Slayden

1

这要看情况。例如,如果您有一个 CLI 枚举,其基础类型为 ushort,则无法保存值为 257 的枚举值。默认情况下,CLI 枚举基于 int,这在大多数情况下应该是可以的。如果您的本机 C++ 代码使用无符号 32 位整数/64 位整数作为枚举的基础类型,请将 CLI 枚举的基础更改为 UInt32、long 或 ulong。


3
我不会有这个问题,因为两个枚举都是int类型。但在这种情况下应该使用哪种类型的转换?应该使用const_cast、static_cast、dynamic_cast、reinterpret_cast、safe_cast还是只需使用C# cast(例如(int))? - Lopper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接