2010-04-12 12 views
7

Ho bisogno di usare questo enum nella mia applicazione C#, ma non mi permetterà di usare questi valori. Quando indico il tipo come uint posso usare il valore -1, e quando specifichi int non posso usare gli ultimi 2 valori. C'è un modo per usare qui la parola chiave non selezionata per permettermi di definire tutti questi valori? Questi valori provengono da una fonte esterna, quindi non posso cambiarli.Come utilizzare valori non sicuri in un enum?

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

risposta

9

Se si desidera che sia un valore diverso da 0xFFFFFFFF, sarà necessario un tipo di dati maggiore di 32 bit. Prova long.

+0

Utilizzando un tipo di dati a 64 bit non è un'opzione, sto usando interop per restituire un valore a 32 bit. –

+0

Se -1 e 0xFFFFFFFF sono tecnicamente la stessa cosa quando si utilizza un uint, suppongo di poter semplicemente rimuovere il valore -1? –

+1

@Jon: -1 non esiste quando stai usando uint - dovresti effettuare una conversione non controllata. –

1

Forse provare enumerare enum anziché int?

2

Poiché questi valori sembrano essere costanti, è sufficiente creare una classe statica per contenere i valori. Inoltre, è possibile utilizzare qualsiasi tipo che vuoi:

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

Un modo per risolvere questo è quello di utilizzare i valori normali per il enum (0, 1, 2, 3), e creare una classe o un paio di metodi per convertire i valori in entrata nei membri enum e viceversa.

+0

Scritto questo post lungo e poi ho notato che hai detto la stessa cosa. +1. @ Jon Tackabury: @ Jon Seigel la risposta è l'opzione più mantenibile. Non dare per scontato che -1 sia uguale a 0xFFFFFFFF a meno che tu non abbia una conoscenza molto approfondita della libreria che stai utilizzando. – Randolpho

3

0xFFFFFFFF è un numero a 32 bit, quindi dovrebbe essere in forma per enum: int (mi sento tipo lungo è un eccessivo :))

Hai provato

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