C# cast object of type int, enum-Werte zulässt
Ich muss nur in der Lage zu werfen ein Objekt enum-Werte zulässt. Objekt enum, null oder ein int. Danke!
public enum MyEnum { A, B }
void Put(object value)
{
System.Nullable<Myenum> val = (System.Nullable<MyEnum>)value;
}
Put(null); //works
Put(Myenum.B); //works
Put(1); //Invalid cast exception!!
Sie sparen sich einige Mühe, wenn Sie stark typisierte Erklärungen. Wenn Sie wissen, dass
Kogan, das ist eine vereinfachte version der Put-Funktion befasst Sie sich mit anderen Datentypen, nicht nur enum
Put
erwartet eine Nullable<MyEnum>
, warum sind Sie deklarieren es mit einem object
?Kogan, das ist eine vereinfachte version der Put-Funktion befasst Sie sich mit anderen Datentypen, nicht nur enum
InformationsquelleAutor dlsou | 2011-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa:
Den cast von boxed
int
zuMyEnum
(wennvalue
ist nicht null) und verwenden Sie dann die implizite Konvertierung vonMyEnum
zuNullable<MyEnum>
.Das ist okay, weil Sie erlaubt sind, um unbox aus der boxed form einer enum-zu seinem zugrunde liegenden Typ, oder Umgekehrt.
Ich glaube, das ist tatsächlich eine Bekehrung, die nicht garantiert, um zu arbeiten, indem Sie die C# - spec, aber ist garantiert, um zu arbeiten, indem die CLI-Spezifikation. So lange, wie Sie laufen Ihrem C# - code auf einer CLI-Implementierung (Sie 🙂 du wirst in Ordnung sein.
+1 ich schwöre, auf einer täglichen basis ich nehmen Anleitung von einem Jon Skeet Antwort auf StackOverflow. Gut gemacht, sir.
Der kürzere Weg:
MyEnum? val = (MyEnum?) value ?? null
Wie wäre es mit:
MyEnum? val = value as MyEnum;
Du meinst mit "wie"? Ja, in der Tat. In der Erwägung, dass der cast zu arbeiten.
InformationsquelleAutor Jon Skeet
Dies ist, weil Sie-unboxing und Gießen in einem Arbeitsgang, was nicht erlaubt ist. Sie nur unbox ein Typ ist, der gleiche Typ, der boxed inneren des Objekts.
Für details empfehle ich die Lektüre von Eric Lippert ' s blog: Repräsentation und Identität.
int
auf eine enum-Typ (mitint
als der zugrunde liegende Typ), oder von einer Box enum-Wert den Ihr zugrunde liegenden Typ.Stimmt - aber das ist auch eher ein Grenzfall (funktioniert nur, weil die "enum" ist eigentlich ein "int" in diesem konkreten Fall) - was passiert, wenn der OP übergibt 0.0 in die Methode? Oder Sie versuchen, diese Technik zu verwenden, mit einem enum unterstützt durch etwas anderes als Int32? Diese wird noch zu einem problem führen...
Dann wird es brechen. Aber der OP sagt: "Objekt kann enum, null oder ein int." In anderen Worten, die Lösung, die ich gegeben habe, funktioniert für das problem vorgestellt. Wir wissen nicht, welches Verhalten erwünscht ist in anderen Situationen.
+1 für den link.
InformationsquelleAutor Reed Copsey
Wenn Sie die Zuweisung eines Wertes an eine nullable-Typ müssen Sie sich bewusst sein, dass es nicht der gleiche wie der zugrunde liegende Typ(zumindest in diesem Fall). So um die Besetzung, die Sie brauchen, um unbox erste:
Das wird nicht funktionieren. Dieser code hat den gleichen Fehler: unboxing und Gießen in der gleichen operation.
Put
bekommen sollteMyEnum?
als parameter.+1 weil es nicht zu arbeiten. Diejenigen, die sagen, es nicht sollten Versuch🙂
Ich habe versucht, bevor ich gepostet hat, aber 🙂
Dies funktioniert, Dank
InformationsquelleAutor TheBoyan