Warum benötigen Enums eine explizite Umwandlung in den Int-Typ?
Es ist kein Verlust von Daten durch, dies zu tun, so was ist der Grund dafür, dass explizit umgewandelt werden enums zu ints?
Wäre es nicht intuitiver sein, wenn es implizit, sagen, wenn Sie einen höheren level-Methode wie:
PerformOperation ( OperationType.Silent type )
wo PerformOperation
fordert eine eingewickelte C++ - Methode, die als solche entlarvt:
_unmanaged_perform_operation ( int operation_type )
InformationsquelleAutor der Frage Joan Venge | 2011-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei primäre und inkonsistente Verwendungen von enums:
Im ersten Fall macht es keinen Sinn, die Behandlung dieser Dinge als zahlen. Die Tatsache, dass Sie gespeichert werden als ganze zahlen ist eine Implementierung detail. Sie können nicht logisch, addieren, subtrahieren, multiplizieren oder dividieren Gold, Silber und Bronze.
Im zweiten Fall, es auch macht keinen Sinn, die Behandlung dieser Dinge als zahlen. Sie können nicht hinzufügen, subtrahieren, multiplizieren oder dividieren. Die einzig sinnvolle Operationen sind die bitweise Operationen.
Enums sind miese zahlen, so sollten Sie nicht in der Lage sein, Sie zu behandeln, als Nummern versehen.
InformationsquelleAutor der Antwort Eric Lippert
Weil enums nicht
int
basiert:So können Sie etwas wie das hier tun:
InformationsquelleAutor der Antwort Philip Rieck
Warum sagst du kein Daten Verlust? Nicht alle enums sind int-Werte, nachdem alle. Sie müssen integer sein-getippt, aber das kann bedeuten, byte, ulong, etc.
Als eine Ecke zu Fall das literal 0 ist implizite, aber; was wäre Ihre use-case hier?
Es ist ziemlich selten, ich dies tun müssen - in der Regel Daten importieren etc. Ein gelegentliches nicht-op cast macht perfekten Sinn für mich, und vermeidet unbeabsichtigte Fehler.
InformationsquelleAutor der Antwort Marc Gravell
Eigentlich denke ich, nicht. In diesem Fall, Sie versuchen, verwenden Sie eine Enum in einem edge-Fall.
Jedoch, wenn enums waren implizit in integer-Werte, dies würde drastisch reduzieren Ihre Wirksamkeit. Durch erzwingen eines int-Konvertierung explizit dem compiler ist die Behandlung von enum als eine Besondere Art - eine von vielen Möglichkeiten, nicht als integer. Dieses mehr zeigt deutlich die Absicht, das enum, und verringert die chance, dass der Programmierer die Fehler (sprich: das zuweisen von Werten, die nicht definiert in enum auf enum-variable, etc).
Ich persönlich bin froh, dass enum in C# ist mehr als (effektiv), einen Konstanten int-Wert.
InformationsquelleAutor der Antwort Reed Copsey
Ist wie C# funktioniert...
Wenn Enum erbt von int, dann sollte dies möglich sein. Enum Erben nicht von int, und daher eine Besetzung erforderlich ist.
Der einzige Weg, um implizite cast-Klassen, wenn Sie Erben.
InformationsquelleAutor der Antwort Jan Sverre
Ich denke, dass die Antwort auf "Warum Enumerationen, erfordern ein explizites" cast to int type?" ist die stark typisierte enums als pro C# sind eine sinnvolle Verteidigung gegen häufige Fehler in der Programmierung.
Vorstellen, ich hatte ein Gemälde-management-Anwendung, basierend auf zwei enums:
- Und Raum-Malerei-Methode wie diese:
In einer Sprache mit stark enum-Typisierung wie in C# einen Befehl wie diesen:
...würde yeild eine compile-Zeit-Fehler (kann keine Farbe in einer textur, die erwartet wird, und Umgekehrt). Aber in Sprachen, wo die enums sind nicht stark typisierte und/oder impliziten Konvertierung auftreten können (einschließlich C-und C++), die sowohl unsere
Colors
und unsereTextures
behandelt werden können alsint
, so können wir gerne ausstellenPaintRoom(Colors.White, Textures.Matt)
Befehl, und es wird kompilieren in Ordnung, aber wir am Ende mit einem Raum, der Glänzend lackiert Rot (0, 2) anstelle des Matt-Weiß (2, 0) , haben wir gedacht und den code auf einen schnellen Blick scheint zu sagen.So stark typisierte enums sind meist eine gute Sache, um Leute zu stoppen, versehentlich setzen Enumerationen, die in Orten, die Sie nicht gedacht sind. Und wo jemand wirklich will Ihre enum als
int
, C# zwingt den Programmierer, um Ihre Absicht klar, durch das beharren auf eine explizite Konvertierung.InformationsquelleAutor der Antwort Jinlye
Wie schon andere gesagt haben, ist es unmöglich, ändern Sie die gewünschten Stimmen aus
EnumType
zuint
. Allerdings gibt es einige workarounds. Zum Beispiel habe ich mehrere enums, die sich für ähnliche Dinge, und wollte in der Lage sein, weisen Sie jeder von Ihnen auf eine variable. Also ging ich mit:und so, ich könnte sagen, dass beide
playerObject.animator.State = Player.STANDING
undmonsterObject.animator.State = Monster.DROOLING
implizit so weit wie die aufrufende Klasse sagen könnte.Also, ja, es ist eine legitime Grund, warum ich die Behandlung von enum-Werte als zahlen.
InformationsquelleAutor der Antwort Radon Rosborough