2012-10-04 31 views
6

Duplicar posible:
convert an enum to another type of enumConversión entre enumeraciones en C#

Cuando se lanza entre las enumeraciones de diferentes tipos, es que, posiblemente, para emitir directamente desde un tipo a otro como tal?

LicenseTypes type; 
TypeOfLicense type2; 

type2 = (TypeOfLicense)type; 

¿O es necesario convertir primero la enumeración a int? El compilador no se queja, pero quiero asegurarme de que no voy a obtener ningún tipo de excepción funky de lanzamiento en el tiempo de ejecución.

Esto puede parecer algo extraño de hacer, pero ambas enumeraciones son idénticas en estructura y valor. Solo los nombres de tipo difieren en este caso.

Respuesta

5

Aunque es un duplicado y lo he marcado también. Usted puede hacer la colada simple, beucase el tipo subyacente es int, puede hacerlo:

LicenseTypes type = (LicenseTypes)TypeOfLicense.value3; 

Aquí type llevará a cabo valor de '0';

Suponga que tiene:

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

Pero si intenta convertir TypeOfLicence.value5 entonces la variable type contendrá el valor int 2

LicenseTypes type = (LicenseTypes)TypeOfLicense.value5; 

También puede buscar en este link para la creación de métodos de extensión para la conversión entre enums. (Es la respuesta aceptada de la pregunta similar)

+0

Vi esa otra pregunta, pero recién ahora vi la última respuesta. Todo lo demás era mucho más complejo de lo que tenía que ser. –

+0

@BasedAsFunk, creo que ni siquiera necesita convertir a 'int', puede usar casting como:' LicenseTypes type = (LicenseTypes) TypeOfLicense.value3; ' – Habib

3

No, pero usted puede hacer esto haciendo algunas suposiciones ...

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

type2 = (TypeOfLicense)(int)type; 

... y esas suposiciones son esto. Debemos suponer que tanto LicenseTypes como TypeOfLicense base int por su valor. También debemos suponer que relacionar los valores subyacentes correlaciona desde una perspectiva comercial (pero eso realmente no es ni aquí ni allá desde una perspectiva técnica).

Tenga en cuenta que esto funciona para otros tipos de base y es posible construir una conversión más compleja que le permita realizar conversiones entre diferentes tipos con conversiones.

+0

Esa suposición es correcta, tengo dos tipos de enum idénticos, pero el primero no es visible desde un nuevo ensamblaje. Mirando hacia atrás ahora, hay otras formas en que podría haber trabajado en esto (usar una int recta hubiera funcionado bien) pero ya no tengo tiempo para volver y hacerlo de la manera "correcta". –

+0

@BasedAsFunk: Sí, es lo que es después de que las aplicaciones llegan tan lejos en su vida muchas veces, por lo que simplemente se las arregla lo mejor que se puede. –

+0

+1. si los tipos base son diferentes, la conversión puede perder precisión (BasedAsFunk está bien ya que las enumeraciones son idénticas). –

0

No importa cómo lo haga, es simplemente una asignación de un número entero a otra variable. Recuerde, las enumeraciones se tratan internamente como enteros y, por lo tanto, no harán ninguna diferencia.

+0

No es del todo cierto, el tipo subyacente es cualquier tipo entero. Es decir.si el tipo de fuente es 'enum Noraml {}' el tipo de destino es 'enum Pequeño: byte {}' de lo que puede perder precisión en el momento de la conversión. –

+0

Usted tiene razón en ese caso. Es cierto cuando ambas enumeraciones son de diferente tipo. –