2013-03-11 4 views
9

Supponiamo, per il bene di questo esempio, che sto cercando di analizzare un file che specifica che due byte arbitrari nel record rappresentano il giorno della settimana, questa convenzione:Come posso definire un'enumerazione in cui più valori si associano a una singola etichetta?

DayOfWeek: 

- 0 = Monday 
- 1 = Tuesday 
- 2 = Wednesday 
- 3 = Thursday 
- 4 = Friday 
- 5 = Saturday 
- 6 = Sunday 
- 7-15 = Reserved for Future Use 

posso definire un'enumerazione di mappare a questo campo, così:

public enum DaysOfWeek 
{ 
    Monday = 0, 
    Tuesday = 1, 
    Wednesday = 2, 
    Thursday = 3, 
    Friday = 4, 
    Saturday = 5, 
    Sunday = 6 
    ReservedForFutureUse 
} 

Ma come posso definire valori validi per ReservedForFutureUse? Idealmente, mi piacerebbe fare qualcosa del tipo:

public enum DaysOfWeek 
    { 
     Monday = 0, 
     Tuesday = 1, 
     Wednesday = 2, 
     Thursday = 3, 
     Friday = 4, 
     Saturday = 5, 
     Sunday = 6 
     ReservedForFutureUse = {7,8,9,10,11,12,13,14,15} 
    } 

Questo problema è solo esacerbato con campi più complicati; supponiamo, ad esempio, che sia il 7 che l'8, in questo caso, si associno allo stesso caso di errore o qualcosa del genere. Come si può catturare questo requisito in un'enumerazione C#?

+2

Il problema di questo: come sarebbe lavorare andando nella direzione opposta? Passare dal valore int all'enumerazione funzionerebbe, ma in che modo C# potrebbe essere in grado di sapere a quale valore int si dovrebbe assegnare l'enum se lo si fa nell'altro modo? – jzworkman

+0

Immagino che il modello di tipo eno sicuro dovrebbe essere di interesse. Dai un'occhiata a: http://stackoverflow.com/a/424414/1236044 – jbl

+0

Puoi descrivere come utilizzerai questo valore 'Riservato'? In futuro cambierai enum, quindi perché dovresti aggiungere qualche valore che verrà modificato (non necessario per uno dei valori elencati) –

risposta

3

Sebbene un determinato valore sottostante possa essere associato a più valori enum, un valore enum può avere esattamente un valore sottostante.

Si potrebbe solo fare questo

public enum DaysOfWeek 
{ 
    Monday = 0, 
    Tuesday = 1, 
    Wednesday = 2, 
    Thursday = 3, 
    Friday = 4, 
    Saturday = 5, 
    Sunday = 6 
    Reserved1 = 7 
    ... 
    Reserved8 = 15 
} 
4

Uno scherzo divertente con enumerazioni è che una variabile definita come un certo tipo enum può contenere i valori che non sono definite da qualsiasi membro di quella enum:

public enum DaysOfWeek 
{ 
    Monday = 0, 
    Tuesday = 1, 
    Wednesday = 2, 
    Thursday = 3, 
    Friday = 4, 
    Saturday = 5, 
    Sunday = 6 
} 

// in other code 
DaysOfWeek someDay = (DaysOfWeek)42; // this is perfectly legal 

Ciò significa che non è davvero necessario definire tutti i possibili valori che possono apparire, ma può piuttosto specificare quelli che significano qualcosa per il codice. Quindi è possibile utilizzare un po 'di "catch-all" if - o switch -block per gestire i valori indefiniti:

switch (someDay) 
{ 
    case DaysOfWeek.Monday: 
    { 
     // do monday stuff 
     break; 
    } 
    case DaysOfWeek.Tuesday: 
    { 
     // do tuesday stuff 
     break; 
    } 
    // [...] handle the other weekdays [...] 
    default: 
    { 
     // handle undefined values here 
     break; 
    } 
}