2009-12-09 11 views

Répondre

37

En supposant que votre code natif est

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

et votre code managé est

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

Vous pouvez jeter de la gestion à l'indigène en utilisant

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

J'utilise toujours static_cast, pas la façon de lancer C#.

+2

À partir du code ci-dessus, je suppose que vous êtes en train de passer de l'origine à l'enum géré. Qu'en est-il de l'autre côté de géré à natif? – Lopper

+5

La distribution statique est votre ami des deux côtés ... nativeST = static_cast (managedST); – mcdave

+0

Merci mcdave! :) – Lopper

1

Cela dépend. Par exemple, si vous avez une énumération CLI qui a un type sous-jacent d'ushort, elle ne peut pas contenir une valeur de 257. Par défaut, l'énumération CLI est basée sur int, ce qui devrait être correct dans la plupart des cas. Si votre code C++ natif utilise des entiers 32 bits ints/64bit non signés comme type sous-jacent si enums, changez la base de votre énumération CLI en UInt32, long ou ulong.

+2

Je n'aurai pas ce problème car les deux enum sont de type int. Mais quel type de casting devrait être utilisé dans ce cas? Devrait-il être const_cast, static_cast, dynamic_cast, reinterpret_cast, safe_cast ou simplement le cast C# (un exemple est (int))? – Lopper