PortMan
PortMan

Reputation: 4523

Cannot cast C# enum to C++ enum when enum is in third assembly

I've got a C# class:

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

which uses the C# enum

public enum ManagedEnum
{
  Enum1,
  Enum2
}

This is accessed by a C++/CLI wrapper class and enum:

enum NativeEnum
{
  Enum1,
  Enum2
};

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

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

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

Now, as long as the C# class and C# enum are in the same assembly, this works fine.

But if the C# enum is in a different C# assembly, the C# class still builds fine, but trying to compile the C++ class yields the error:

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

Upvotes: 0

Views: 856

Answers (2)

PortMan
PortMan

Reputation: 4523

In trying out Aaron P's answer, I discovered that the problem was that my C++ project didn't have the C# assembly with the enums in it as a reference. Once I added that reference, it all worked fine.

Upvotes: 1

Aaron Peavy
Aaron Peavy

Reputation: 11

Try deriving the underlying value, then cast to the native enum.

This is a crude way of doing it, but may be sufficient in your case.

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

Another way is to create a native template method taking both types and the managed enum input, and returning the native type. In such a case, you would have to use reflection to ascertain the underlying type of the managed enum.

Upvotes: 1

Related Questions