C'è qualcosa che non riesco a capire in C#. Puoi lanciare un valore fuori scala int
in un enum
e il compilatore non sussulta. Immaginate questo enum
:Casting to enums in C#
enum Colour
{
Red = 1,
Green = 2,
Blue = 3
}
Ora, se si scrive:
Colour eco;
eco = (Colour)17;
Il compilatore pensa che va bene. E anche il runtime. Uh?
Perché il team C# ha deciso di rendere questo possibile? Questa decisione non coglie il punto di utilizzo di enumerazioni, credo, in scenari come questo:
void DoSomethingWithColour(Colour eco)
{
//do something to eco.
}
In un linguaggio forte tipizzato come C#, vorrei pensare che eco
sarà sempre contenere un valore legale Colour
. Ma questo non è il caso. Un programmatore può chiamare il mio metodo con un valore di 17 assegnato a eco
(come nel frammento di codice precedente), quindi il codice nel mio metodo non deve presupporre che eco
detenga un valore legale Colour
. Ho bisogno di testarlo esplicitamente e gestire i valori eccezionali come mi pare. Perchè è questo?
A mio modesto parere, sarebbe molto più bello se il compilatore ha emesso un messaggio di errore (o anche un avvertimento) quando lancia un out-of gamma int
in un enum
, se il valore int
è noto al momento della compilazione. In caso contrario, il runtime dovrebbe generare un'eccezione nell'istruzione di assegnazione.
Cosa ne pensi? C'è qualche ragione per cui è così?
(. Nota Questa è una domanda I posted ages ago on my blog ma non ottenne risposta informativo.)
Il tuo punto di essere? :-) Se vuoi rendere SouthEast una direzione valida, penso che dovresti includerlo nella dichiarazione enum come SouthEast = 10, ad esempio. Essere d'accordo? – CesarGon
Sono chiamate enumerazioni di bandiere. Design molto vaild. –
No, non sono d'accordo. I campi di bit sono un uso perfettamente valido di un enum, tanto che l'attributo [Flags] non è nemmeno richiesto di usarli come tali. –