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);
È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top