2010-04-12 7 views
7

Je dois utiliser cette énumération dans mon application C#, mais elle ne me permettra pas d'utiliser ces valeurs. Lorsque je spécifie le type en tant que uint, je peux utiliser la valeur -1, et quand je spécifie int je ne peux pas utiliser les 2 dernières valeurs. Existe-t-il un moyen d'utiliser le mot clé non contrôlé ici pour me permettre de définir toutes ces valeurs? Ces valeurs proviennent d'une source externe, donc je ne peux pas les changer.Comment utiliser des valeurs dangereuses dans une énumération?

internal enum MyValues : int 
{ 
    value1 = -1, 
    value2 = 0, 
    value3 = 0x80000000, 
    value4 = 0xFFFFFFFF 
} 

Répondre

9

Si vous voulez que -1 soit une valeur différente de 0xFFFFFFFF, vous aurez besoin d'un type de données supérieur à 32 bits. Essayez long.

+0

L'utilisation d'un type de données 64 bits n'est pas une option, j'utilise interop pour retourner une valeur 32bit. –

+0

Si -1 et 0xFFFFFFFF sont techniquement la même chose en utilisant un uint, je suppose que je peux juste supprimer la valeur -1? –

+1

@Jon: -1 n'existe pas lorsque vous utilisez uint - vous devez effectuer une conversion non contrôlée. –

1

Peut-être essayer ulong enums au lieu de int?

2

Étant donné que ces valeurs semblent être constantes, créez simplement une classe statique pour contenir les valeurs. En outre, vous pouvez utiliser ce que les types que vous voulez:

public static class MyValues 
{ 
    public const int value1 = -1; 
    public const int value2= 0; 
    public const int value3 = 0x80000000; 
    public const int value4 = 0xFFFFFFFF; 
} 
2

Une façon de résoudre ce problème est d'utiliser des valeurs normales pour la enum (0, 1, 2, 3), et de créer une classe ou d'une paire de méthodes pour convertir les valeurs entrantes en enum membres et vice-versa.

+0

A écrit ce grand long message et ensuite remarqué que vous avez dit la même chose. +1 @Jon Tackabury: La réponse de @Jon Seigel est l'option la plus maintenable. Ne supposez pas que -1 est la même chose que 0xFFFFFFFF sauf si vous avez une connaissance très intime de la bibliothèque que vous utilisez. – Randolpho

3

0xFFFFFFFF est un nombre 32 bits, il devrait donc être apte à ENUM: int (je me sens type long est un surpuissant :))

Avez-vous essayé

enum YourEnum : int { /*...*/, value4 = unchecked((int)0xFFFFFFFF) };