Lanciare un numero fuori range in un enum in C # non produce un'eccezione
Domanda
Il codice seguente non produce un'eccezione ma passa invece il valore da 4 a tst. Qualcuno può spiegare il motivo dietro questo?
public enum testing
{
a = 1,
b = 2,
c = 3
}
testing tst = (testing)(4);
Soluzione
In C #, a differenza di Java, gli enum non sono controllati. Puoi avere qualsiasi valore del tipo sottostante. Questo è il motivo per cui è abbastanza importante controllare i tuoi input.
if(!Enum.IsDefined(typeof(MyEnum), value))
throw new ArgumentOutOfRangeException();
Altri suggerimenti
Poiché il tuo enum si basa su int, può accettare qualsiasi valore che int possa. E dal momento che stai dicendo esplicitamente al compilatore (attraverso il cast) che è giusto lanciare 4 nel tuo enum, lo fa.
Ogni enum ha un tipo numerico sottostante (ad es. int) che viene usato per la rappresentazione. Anche se un valore non ha un nome, è un possibile valore che può avere l'enum.
Quello che gli altri non hanno detto: con il casting, dici al compilatore che sai cosa stai facendo. Quindi, se lo dici, considera questo come un valore enum, lo fa. Gli altri poster hanno sottolineato perché questo è ancora consentito, poiché il compilatore C # non consente molte cose brutte, anche se dici di sapere cosa stai facendo.
Sarebbe davvero un male se il valore non fosse consentito, perché non è possibile salvare un valore flag come int. Oppure, qualcuno ha dovuto verificare se int è una delle combinazioni consentite, che può essere molto se si utilizza un enum di flag (con valori che possono essere uniti o uniti).