Esta pregunta se refiere a la fundición de las enumeraciones dentro de los métodos genéricosC# Fundición con objetos a enumeraciones
dado una enumeración
public enum Crustaceans
{
Frog = 1,
Toad = 4
}
que puedo crear una instancia de mi enumeración simplemente lo suficientemente
short val = 4;
Crustaceans crusty = (Crustaceans) val;
Sin embargo, si
short val = 4;
object obj = (object) val;
Crustaceans crusty = (Crustaceans)obj;
se produce una excepción de tiempo de ejecución al intentar realizar la inicialización de crujiente.
¿Alguien puede explicar por qué esto sucede y por qué no es legal hacer tal cosa?
No es que realmente quisiera hacer esto, pero me topo con un problema cuando intento que algo similar ocurra con los genéricos y efectivamente eso es lo que sucede bajo las sábanas. es decir
public T dosomething<T>(short val) where T : new()
{
T result = (T)(object) val;
return result;
}
Así que lo que estoy tratando de hacer es tener una función genérica que trabaja con enumeraciones y no enumeraciones (no tan crítico, pero no estaría mal) que se puede ajustar a un valor corto sin lanzar una excepción y realmente inicializando el valor de enum correcto.
¿Sería fuera de lugar señalar que la rana y el sapo no son crustáceos?:) – JTMon
posible duplicado de [¿Por qué no puedo borrar un int como un decimal?] (Http://stackoverflow.com/questions/1085097/why-cant-i-unbox-an-int-as-a-decimal) –
@sweetfa: si bien la pregunta que mencioné se refiere a int frente a decimal y no enumeraciones, explica el comportamiento (que está relacionado con el boxeo y el desempaquetado). En particular, la respuesta aceptada se refiere a un artículo de Eric Lippert: "[Representation and Identity] (http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx) ", lo cual explica esto en gran detalle. –