2009-12-09 13 views

Antwort

37

Angenommen, Ihre nativen Code ist

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

und verwaltetem Code ist

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

Sie vom verwalteten zum nativen werfen können mit

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

ich immer static_cast verwenden, nicht die C# Art des Castings.

+2

Aus dem obigen Code, nehme ich an, dass Sie von nativen zu verwalteten enum casten. Was ist umgekehrt von "gemanagt" zu "nativ"? – Lopper

+5

Statische Besetzung ist Ihr Freund in beide Richtungen ... nativeST = statischer_cast (managedST); – mcdave

+0

Danke mcdave! :) – Lopper

1

Kommt drauf an. Wenn Sie zum Beispiel eine CLI-Enumeration haben, die einen zugrunde liegenden Typ von ushort hat, kann sie keinen Wert von 257 enthalten. Standardmäßig basiert die CLI enum auf int, was in den meisten Fällen in Ordnung sein sollte. Wenn Ihr systemeigener C++ - Code bei Enums unsignierte 32-Bit-Ints/64-Bit-Ints als zugrunde liegenden Typ verwendet, wechseln Sie die Basis Ihrer CLI-Enumeration zu UInt32, long oder ulong.

+2

Ich werde dieses Problem nicht haben, da beide enum vom Typ int sind. Aber welche Art von Cast sollte in diesem Fall verwendet werden? Sollte es const_cast, static_cast, dynamic_cast, reinterpret_cast, safe_cast oder nur die C# -Casting sein (ein Beispiel ist (int))? – Lopper