2016-03-11 2 views
0

J'ai recherché dans les autres réponses similaires à ce sujet, mais je n'ai rien trouvé de complètement pertinent. J'essaie d'assigner des valeurs à certaines énumérations en C#, en utilisant des valeurs marquées comme const constantes dans un fichier C++/CLI, qui sont compilées dans une DLL et référencées dans le projet C#. Tout cela fonctionne bien, sauf qu'il me donne le "L'expression affectée à 'XXX' doit être constante", ce que je m'attendais, si la valeur C++/CLI n'était pas une constante. Mon code C++/CLI est généré automatiquement à partir de fichiers tiers fournis par le fournisseur, mes options de modification de ce côté sont donc extrêmement limitées.Attribuer une valeur à C# enum à partir de C++/CLI const

Voici quelques extraits:

Le fichier C++/CLI:

public ref class SEVERE_LEVEL sealed { 
    public: 
    static const System::Int32 VALUE = 200; 
    private: 
    SEVERE_LEVEL() {} 
}; 

Et le fichier C#:

public enum LoggerLevel { 
    SevereLevel = SEVERE_LEVEL.VALUE // This gives the "must be constant" error 
} 

Il existe plusieurs niveaux de journalisation définis chacun dans leur propre séparée class dans le fichier C++/CLI. Je veux utiliser l'enum C# comme type de paramètre dans certains appels de méthode pour s'assurer que seules les valeurs valides sont passées. Des idées pour faire ce travail ou des suggestions sur des conceptions alternatives?

+0

C'est un générateur de code assez excentrique. J'essaierais juste de brouiller une déclaration de «public enum class», comme elle aurait dû l'être. –

Répondre

0

Le mot clé C++ const ne correspond à rien dans .NET. C++/CLI ajoute de nouveaux mots-clés contextuels pour correspondre à la fonctionnalité .NET: initonly et literal

Si vous utilisez literal System::Int32 VALUE = 200; alors cela devrait fonctionner. Il n'y a pas de magie pour que le compilateur C# définisse des énumérations en utilisant des valeurs qui ne sont pas marquées "littéral" dans les métadonnées .NET.

+0

Merci pour cette suggestion! J'ai enveloppé les classes générées automatiquement dans une nouvelle classe C++ contenant des membres marqués avec le mot clé "literal" égal aux membres const statiques constants. Cela me permet de les assigner à enums en C# parfaitement bien. Merci! – Hamo2k1