当枚举处于第三个程序集时,无法将C#枚举转换为C ++枚举

时间:2014-11-14 00:50:27

标签: c++-cli

我有一个C#课程:

public class MyManagedClass
{
  public ManagedEnum EnumValue {get; set;}
}

使用C#enum

public enum ManagedEnum
{
  Enum1,
  Enum2
}

这是由C ++ / CLI包装器类和枚举:

访问的
enum NativeEnum
{
  Enum1,
  Enum2
};

class WrapperClass
{
public:
  WrapperClass(ManagedNamespace::MyManagedClass^ inManaged):
    _Managed(inManaged)
  {}

  NativeEnum GetEnumValue()
  {
    return (NativeEnum)_Managed->EnumValue;
  }

private:
    gcroot<ManagedNamespace::MyManagedClass^> _Managed;
};

现在,只要C#类和C#枚举在同一个程序集中,这就可以了。

但是如果C#枚举在不同的C#程序集中,那么C#类仍然可以正常构建,但是尝试编译C ++类会产生错误:

error C2440: 'type cast' : cannot convert from 'OtherNamespace::ManagedEnum' to 'OtherNamespace::NativeEnum'
1>          Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast

2 个答案:

答案 0 :(得分:1)

尝试导出基础值,然后转换为本机枚举。

这是一种粗暴的做法,但在你的情况下可能就足够了。

NativeEnum someMethod(ManagedEnum myEnum)
{
  return (NativeEnum)(int)myEnum;
}

另一种方法是创建一个本机模板方法,同时获取两种类型和托管枚举输入,并返回本机类型。在这种情况下,您必须使用反射来确定托管枚举的基础类型。

答案 1 :(得分:1)

在尝试Aaron P的回答时,我发现问题在于我的C ++项目没有C#程序集,其中的枚举作为参考。一旦我添加了该引用,它一切正常。