Wann sind zwei Enums in C # gleich?

7

Ich habe zwei Enums erstellt und ich weiß, dass sie nicht gleich sind, aber ich denke, es macht Sinn, dass sie gleich seit ihrer String-Darstellung sind Darstellung ist gleich (und sogar gleich ...).

Mit anderen Worten: Ich möchte, dass der erste Test besteht und der zweite fehlschlägt. In Wirklichkeit jedoch versagen sie beide. Also: Wann sind zwei Enums in C # gleich? Oder gibt es überhaupt den Gleichheitsoperator in C # zu definieren?

Danke!

%Vor%

UPDATE: 1) Die Antworten vergleichen also alle Darstellungen, seien es Inte oder Strings. Das Enum selbst ist immer ungleich ich sammle? Kein Mittel, Gleichheit dafür zu definieren?

    
Peter 05.11.2009, 21:22
quelle

7 Antworten

14

Enums sind stark in C # eingetippt, daher enumA.one != enumB.one . Wenn Sie nun jede Aufzählung in ihren ganzzahligen Wert umwandeln würden, wären sie gleich.

%Vor%

Ich möchte auch die Aussage herausfordern, dass, weil sie dieselbe Integer- oder String-Repräsentation haben, sie gleich oder gleich sein sollten. Bei zwei Aufzählungen NetworkInterface und VehicleType wäre es für C # oder das .Net Framework nicht logisch, NetworkInterface.None gleich VehicleType.None im Vergleich zur Aufzählung entweder als Wert oder als Zeichenfolge zuzulassen. Wenn der Entwickler jedoch die stark typisierte Enumeration in eine Ganzzahl oder eine Zeichenfolge umwandelt, kann die Sprache oder das Framework nichts bewirken, um zu verhindern, dass die beiden gleich sind.

Um dies zu verdeutlichen, können Sie MyEnum.Equals nicht überschreiben, um eine andere Gleichheits-Methode zur Verfügung zu stellen. .Net Enums sind nicht ganz die Bürger erster Klasse, die sie in späteren Versionen von Java sind, und ich wünsche mir, dass C # umfangreichere Interaktionen mit Enums ermöglicht.

    
user7116 05.11.2009, 21:24
quelle
3

Ich verweise auf die C # -Sprachspezifikation v3.0, aus der dieses Zitat aus dem Abschnitt Enum auf Seite 29 extrahiert wurde:

"Jeder Enum-Typ hat einen entsprechenden Integraltyp, den so genannten Typ des Enum-Typs. Ein Enum-Typ, der einen darunter liegenden Typ nicht explizit deklariert, hat einen int-Typ. Das Speicherformat und der Bereich möglicher Werte eines Enum-Typs sind bestimmt durch den zugrunde liegenden Typ Die Menge der Werte, die ein Enum-Typ annehmen kann, ist nicht durch seine Enum-Member begrenzt.Insbesondere kann jeder Wert des zugrunde liegenden Typs einer Enumeration in den Enum-Typ umgewandelt werden und ist ein bestimmter gültiger Wert von diesem Enum-Typ. "

Die Methode .AreEqual prüft wirklich die Äquivalenz, während die zweite die Identität testet. Also, werfen Sie einfach jeden auf seinen zugrunde liegenden Typ (in diesem Fall int) und machen Sie dann den Vergleich.

%Vor%     
cpkilekofp 05.11.2009 21:32
quelle
2

Im Gegensatz zu Java bietet C # keine Möglichkeit zum Hinzufügen von Methoden (z. B. operator == ()) zu einer Enumeration.

Was ich in der Vergangenheit getan habe, wenn smartere Enums benötigt werden, ist das Erstellen einer Klasse XHelper (wobei X der Name der Enumeration ist), und ich lege alle Methoden darauf. Also so etwas wie:

%Vor%

Obwohl ich mich nicht erinnere, in einen Fall zu kommen, in dem ich zwei verschiedene enums brauchte, um dasselbe zu bezeichnen.

    
Jeffrey L Whitledge 05.11.2009 22:23
quelle
1

Wenn sie übereinstimmen sollen, wirf sie auf int

%Vor%

würde bestehen, weil sie beide die ersten sind. Wenn Sie wollten, dass sie übereinstimmen, weil beide "Eins" sagen, dann müssen Sie Reflexion verwenden.

    
Lou Franco 05.11.2009 21:24
quelle
1

Um ehrlich zu sein, Gleichheit ist die meiste Zeit nicht geradlinig.

Ich würde geneigt sein, eine Hilfsklasse zu erstellen, die IEqualityComparer (und alle anderen Gleichheitstests, zum Beispiel IsSame ()) implementiert und diese verwendet.

    
Tim Jarvis 05.11.2009 21:29
quelle
0
%Vor%     
Daniel A. White 05.11.2009 21:24
quelle
0

Sie könnten versuchen, sie zu werfen:

%Vor%     
Jonas 05.11.2009 21:24
quelle

Tags und Links