Byte-enum-Vergleich in C#
Angesichts dieser enum -
public enum UserStatus : byte
{
Approved = 1,
Locked = 2,
Expire = 3
}
warum wird diese überprüfung immer false zurück, wenn usr.Status = 1
if(usr.Status.Equals(UserStatus.Approved))
return true;
return false;
Vergleich scheint zu funktionieren - es gibt keine compile-Zeit-Fehler oder Laufzeit-exception. Bitte beachten ich bin nicht der Autor von diesem Stück code, und würde gerne herausfinden, warum der Autor wählte enum-Typ byte
- und warum das nicht funktioniert wie es sollte.
Re "kein Fehler"; da man sich mit dem boxed-version, fast alles, was legal ist. Wenn, jedoch, verwenden Sie die mehr-entsprechende
==
, wird es Ihnen sagen: Error [number] Operator '==' cannot be applied to operands of type 'byte' and 'UserStatus'
InformationsquelleAutor mare | 2011-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie haben, zu werfen.
Die equals-Methode prüft, ob
UserStatus
ist einint
(abhängig von der Art, die Sie definiert haben, auf die Eigenschaftusr.Status
). Es wird dann wieder nicht (es ist der TypUserStatus
) so zurückfalse
Besseren code wäre:
Status
alsUserStatus
und nicht nurint
. Schließlich stellt es eineUserStatus
, ist es nicht?Auch, wenn Sie
usr.Status == UserStatus.Approved
dann würde der compiler warnen Sie über diese Art von Dingen.das ist wahr. Der Grund, warum ich schrieb, dass es der Weg war, weil er nicht nach dem code. Es könnte auch sein, eine generierte Klasse, die von linq zum Beispiel, wo Sie nicht legen Sie den Typ auf
UserStatus
Re besser code... wie pro mein Kommentar auf die Frage, würde ich dir raten
==
hier, da der compiler meldet Fehler auf==
, aber nicht aufEquals
Ich geändert
InformationsquelleAutor Oskar Kjellin
Die erste Sache, die alle Gleich Umsetzung in der Regel überprüft wird: "ist das die richtige Art". Und
UserStatus
ist nicht das gleiche wiebyte
.(eigentlich passiert das nur, weil Sie boxed die Einzelteile über Ihre inkompatible Nutzung von
Equals
; auf IL-Ebene sind Sie ununterscheidbar, bis boxed)Müssen Sie vergleichen, Sie als Elemente des gleichen Typs. Leihen einige code aus
byte
:Also im Grunde casting der enum-zu-byte-Vergleich vor dem? Der innere Wert wird sich nicht ändern, da es immer noch ein byte richtig?
von
object
zu einemenum
oder zubyte
ist ein unboxing - Betrieb - es wird Auszug den internen Wert (aus der box) wie dieenum
-Typ oderbyte
. Das ändert nicht den Wert in der box in irgendeiner Weise - es ist unberührt. Die extrahiert - Wert ist nur ein raw-Grundwert (in diesem Fall auf dem stack). Es werden die gleichen zugrunde liegenden Wert als er vorher hatte. Wenn das nicht ist, was Sie Fragen, können Sie das konkretisieren?InformationsquelleAutor Marc Gravell
Das ist, weil die
Usr.Status
enthält eine ganze Zahl und dieUserStatus.Approved
gibt eine Zeichenfolge, D. H.,Approved
. Also, ein integer-Wert1
kann nicht gleich dem StringApproved
. Also, müssen Sie konvertieren Sie das Enum-status auch eine ganze Zahl, indem Sie den folgenden codeHier das Casting ist nicht auf die Zeichenfolge, sondern auf den Status "Genehmigt" UserStatus Enum, so wird es wieder 1.
Ja, und Sie sagte nur, dass oben UserStatus.Genehmigt gibt immer einen string, und das wäre nicht gewirkt. Bedenken Sie, dass Ihre Lösung funktioniert, aber deine Erklärung ist einfach nur falsch.
InformationsquelleAutor Sai Kalyan Kumar Akshinthala