Quelle est la méthode correcte de conversion (en C++/CLI) d'un code natif enum
en un code managé enum
qui contient les mêmes valeurs enum
? Y a-t-il une différence avec l'utilisation de la méthode de conversion C# comme par exemple (int)
en C++/CLI.C++/CLI: conversion d'une énumération non gérée en une énumération gérée
Répondre
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#.
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.
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
À 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
La distribution statique est votre ami des deux côtés ... nativeST = static_cast (managedST); –
mcdave
Merci mcdave! :) – Lopper