Diese Frage Aufzählungen betrifft Gießen von Aufzählungen innerhalb generischen MethodenC# Casting mit Objekten
eine Enumeration
public enum Crustaceans
{
Frog = 1,
Toad = 4
}
ich eine Instanz meiner Enum erstellen kann einfach genug gegeben
short val = 4;
Crustaceans crusty = (Crustaceans) val;
Wenn jedoch
short val = 4;
object obj = (object) val;
Crustaceans crusty = (Crustaceans)obj;
wird eine Laufzeitausnahme ausgelöst, die versucht, die Initialisierung von Crusty durchzuführen.
Kann jemand erklären, warum dies geschieht, und warum es nicht legal ist, so etwas zu tun.
Nicht, dass ich das wirklich tun wollte, aber ich habe ein Problem, wenn ich versuche, etwas Ähnliches mit Generika zu erreichen und effektiv ist das, was unter der Decke passiert. dh
public T dosomething<T>(short val) where T : new()
{
T result = (T)(object) val;
return result;
}
Also, was ich bin versucht, eine generische Funktion zu tun ist, die mit Aufzählungen und nicht-Aufzählungen arbeitet (nicht so kritisch, aber schön wäre), die ohne Auslösen einer Ausnahme auf einen kurzen Wert eingestellt werden kann, und tatsächlich den korrekten Enum-Wert initialisiert.
Typ verändern Wäre es aus der Linie darauf hinweisen, dass Frosch und Kröte sind nicht Krebstiere?:) – JTMon
möglich Duplikat von [Warum kann ich nicht ein int als Dezimaltrennzeichen ausgeben?] (Http://stackoverflow.com/questions/1085097/why-cant-i-unbox-an-int-as-a-decimal) –
@sweetfa: während die Frage, auf die ich hingewiesen habe, sich mit int vs. dezimal und nicht enums befasst, erklärt es das Verhalten (das mit Boxen und Unboxing zusammenhängt). Insbesondere bezieht sich die angenommene Antwort auf einen Artikel von Eric Lippert: "[Repräsentation und Identität] (http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx) ", was dies sehr detailliert erklärt. –