2010-02-25 24 views
6

La mia domanda è piuttosto semplice, ma non ho trovato un modo per implementare il mio codice nel modo in cui lo voglio. Così ho iniziato a chiedermi se il codice che voglio implementare non è buono. E se lo è, qual è il modo migliore per farlo.Utilizzo di enum come costante intera in C#

Qui si va:

class InputManager 
{ 
    SortedDictionary<ushort,Keys> inputList = new SortedDictionary<ushort,Keys>(); 

    public void Add(ushort id, Keys key) {...} 
    public bool IsPressed(ushort id) {...} 
} 

class Main 
{ 
    private enum RegisteredInput : ushort 
    { 
     Up, 
     Down, 
     Confirm 
    } 

    public Main() 
    { 
      InputManager manager = new InputManager(); 

      manager.Add(RegisteredInput.Up, Keys.Q); 
      manager.Add(RegisteredInput.Down, Keys.A); 
      manager.Add(RegisteredInput.Confirm, Keys.Enter); 
    } 

    void update() 
    { 
    if(manager.IsPressed(RegisteredInput.Up)) action(); 
    } 
} 

Questo codice non viene compilato, dà errori di questo genere:

Il metodo migliore partita overload per 'InputManager.Add (ushort, Keys)' ha alcuni argomenti non validi
argomento '1': impossibile convertire da 'RegisteredInput' a 'ushort'

Se io uso un cast come in manager.Add((ushort)RegisteredInput.Up, Keys.Q); funzionerà. Ma poiché il cast deve essere esplicito, mi chiedevo se non fosse un codice consigliato in C# come in C++ e se c'è un modo migliore di farlo (come usare const ushort per ogni valore, che non mi piace molto).

La risposta migliore che ho ottenuto finora è stata da this thread, ma suona molto simile a un trucco, mi sono preoccupato.

Grazie!

+5

Perché il dizionario non è definito come 'Dictionary '? Inoltre, cerca di evitare di ridigitare i messaggi di errore e il codice nei siti web quando chiedi informazioni sulle cose, le possibilità che tu faccia qualcosa di sbagliato su cui verremo impiccati è lì. Come ... il messaggio di eccezione ha effettivamente chiamato il metodo "Addd" con 3 d's? Come possiamo fidarci di te per copiare effettivamente il codice effettivo usato e non ridigitare qualcosa di semplificato che ha altri problemi del tutto? –

+0

Perché non voglio tasti ripetuti. Riguardo al messaggio di errore, non ho ridigitato, ho rimosso solo molto spazio dei nomi irrilevante. Ho anche cambiato i veri nomi dei metodi, perché non sono in inglese. –

+0

Non capisco cosa intendi per "tasti ripetuti". Puoi elaborare? –

risposta

7

Imposta InputManager come tipo generico. IE:

class InputManager<T> 
{ 
    SortedDictionary<T,Keys> inputList = new SortedDictionary<T,Keys>(); 

    public void add(T id, Keys key) {...} 
    public bool isPressed(T id) {...}  
} 
+0

Bello! Così semplice, eppure non mi è venuto in mente. Penso che andrò con questa soluzione. Grazie! –

5

Il cast implicito è necessaria per enumerazioni Consiglio questo:

public static class RegisteredInput { 
    public const ushort Up = 0; 
    public const ushort Down = 1; 
    public const ushort Confirm = 2; 
} 
+0

Bene, allora ... batti il ​​mio un minuto! Idem, ovviamente! – Pwninstein

+0

Ma pensi davvero che questo sia un modo migliore per scrivere questo codice, C# -wise? Non mi piace il fatto che devo simulare il funzionamento di base di un enum che dà automaticamente valori alle enumerazioni. –

+0

Un sacco di problemi tecnici in cui mi sono imbattuto in passato mi hanno recentemente allontanato da Enums.Uso questa pratica per tutte le mie costanti sia che si tratti di intoni, stringhe, date, ecc. È un po 'più di lavoro di un Enum, ma non di molto. –

7

Perché non solo di definire il dizionario con la tua enumerazione? C'è una ragione per cui deve essere un int?

public void add(RegisteredInput id, Keys key) {...} 

Inoltre, per inciso, è generalmente consigliabile che i membri pubblicamente Certificazione Turismo e handicap (metodi, tipi, ecc) dovrebbero essere pascal carter (in altre parole, invece di Addadd).

+0

Circa il pascal cased, è nell'originale. Lo correggerò anche qui. Scusate! Non voglio usare l'enum come chiave direttamente per evitare l'accoppiamento. –