web-dev-qa-db-ja.com

C ++ / CLI:アンマネージド列挙型からマネージド列挙型へのキャスト

ネイティブコードenumから同じenum値を含むマネージコードenumに(C++/CLIで)キャストする正しい方法は何ですか?たとえば、C++/CLIの(int)のようなC#のキャスト方法を使用することに違いはありますか?.

28
Lopper

ネイティブコードが

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#のキャスト方法ではありません。

39
mcdave

場合によります。たとえば、基になるタイプがushortであるCLI列挙型がある場合、257の値を保持することはできません。デフォルトでは、CLI列挙型はintに基づいており、ほとんどの場合問題ありません。ネイティブC++コードが列挙型の基になる型としてunsigned32bit ints/64bit intsを使用する場合は、CLI列挙型のベースをlongまたはulongのUInt32に切り替えます。

1