2012-10-04 15 views
6

Eventuali duplicati:
convert an enum to another type of enumCasting Tra Enums in C#

Quando la fusione tra le enumerazioni di tipo diverso, è forse per lanciare direttamente da un tipo all'altro in questo modo?

LicenseTypes type; 
TypeOfLicense type2; 

type2 = (TypeOfLicense)type; 

Oppure è necessario eseguire prima l'enum in un primo? Il compilatore non si lamenta, ma voglio essere sicuro che non otterrò una sorta di eccezione di casting funky in fase di runtime.

Questa può sembrare una cosa strana da fare, ma entrambe le enumerazioni sono identiche per struttura e valore. Solo i nomi dei tipi differiscono in questo caso.

risposta

5

Anche se è un duplicato e l'ho segnalato anche. Si può fare semplice fusione, beucase tipo sottostante è int, si può fare:

LicenseTypes type = (LicenseTypes)TypeOfLicense.value3; 

Qui type terrà valore '0';

Supponiamo di avere:

public enum LicenseTypes 
{ 
    value1, 
    value2, 
} 
public enum TypeOfLicense 
{ 
    value3, 
    value4, 
    value5 
} 

Ma se si tenta di gettare TypeOfLicence.value5 allora la variabile type terrà il valore int 2

LicenseTypes type = (LicenseTypes)TypeOfLicense.value5; 

È inoltre possibile guardare a questo link per la creazione di metodi di estensione per la conversione tra enumerazioni. (È la risposta accettata alla domanda simile)

+0

Ho visto quell'altra domanda, ma solo ora ho visto l'ultima risposta in basso. Tutto il resto era molto più complesso di quanto doveva essere. –

+0

@BasedAsFunk, credo che non sia nemmeno necessario eseguire il cast in 'int', puoi usare casting come:' TipoTipi di licenza = (LicenseTypes) TypeOfLicense.value3; ' – Habib

3

No, ma è possibile farlo fare qualche ipotesi ...

LicenseTypes type = LicenseTypes.Type1; 
TypeOfLicense type2 = TypeOfLicense.Type2; 

type2 = (TypeOfLicense)(int)type; 

... e quei presupposti sono questo. Dobbiamo supporre che sia LicenseTypes sia TypeOfLicense base int per il loro valore. Dobbiamo anche presumere che la fusione reciproca dei valori sottostanti sia correlata da una prospettiva di business (ma in realtà non è né qui né là dal punto di vista tecnico).

Si noti che questo funziona per altri tipi di base ed è possibile creare una conversione più complessa che consente di eseguire il cast tra diversi tipi di conversioni.

+0

Questa supposizione è corretta, ho due tipi di enum identici, ma il primo non è visibile da un nuovo assembly. Guardando indietro ora, ci sono altri modi in cui avrei potuto aggirare questo problema (usando un straight straight avrebbe funzionato bene) ma non ho più tempo per tornare indietro e farlo nel modo "giusto". –

+0

@BasedAsFunk: Sì, è quello che succede dopo che le applicazioni si sono spinte così lontano nella loro vita spesso e quindi ci si limita a risolverle nel miglior modo possibile. –

+0

+1. se i tipi di base sono diversi, la conversione può perdere precisione (BasedAsFunk è OK poiché le enumerazioni sono identiche). –

0

Indipendentemente da come lo si fa, si tratta semplicemente dell'assegnazione di un intero a un'altra variabile. Ricorda, le enumerazioni sono trattate internamente come numeri interi e quindi non farà alcuna differenza.

+0

Non è del tutto vero - il tipo sottostante è un qualsiasi tipo intero. Cioèse il tipo di fonte è 'enum Noraml {}' il tipo di destinazione è 'enum Small: byte {}' di quanto si possa perdere la precisione al momento della conversione. –

+0

Hai ragione in questo caso. È vero quando entrambe le enumerazioni sono di tipo diverso. –