2009-11-05 13 views
7

Ho creato due enumerazioni e so che non sono lo , ma penso che abbia un senso essere uguale a poiché la loro rappresentazione di stringa e la loro rappresentazione numerica sono uguali (e anche lo stesso ...).Quando due enumerazioni sono uguali in C#?

In altre parole: vorrei che il primo test passasse e il secondo fallisse. In realtà però, entrambi falliscono. Quindi: quando due enum in C# sono uguali? O c'è comunque la possibilità di definire l'operatore di uguale in C#?

Grazie!

public enum enumA {one, two} 

    public enum enumB {one, two} 

    [Test] 
    public void PreTest() 
    {   
    Assert.AreEqual(enumA.one,enumB.one); 
    Assert.AreSame(enumA.one, enumB.one); 
    } 

UPDATE: 1) Così le risposte finora tutti confronta rappresentazioni, sia interi o stringhe. Il numero dello stesso è sempre disuguale. Nessun mezzo per definire l'uguaglianza per questo?

+0

Duplicato: http://stackoverflow.com/questions/1410131/comparing-two-enum-types-forquivalence –

+0

@Robert: grazie per il collegamento, interessante e correlato. Chiaramente non duplicato: chiede il valore di un enum. – Peter

risposta

14

enumerazioni sono fortemente tipizzati in C#, quindi enumA.one != enumB.one. Ora, se tu convertissi ogni enumerazione nel loro valore intero, sarebbero uguali.

Assert.AreEqual((int)enumA.one, (int)enumB.one); 

Inoltre, mi piacerebbe sfidare l'affermazione che perché hanno lo stesso numero intero o rappresentazione di stringa che dovrebbero essere gli stessi o uguale. Date due enumerazioni NetworkInterface e VehicleType, non sarebbe logico per C# o .Net Framework per consentire NetworkInterface.None uguale a VehicleType.None quando confrontato come enumerazione, per valore o stringa. Tuttavia, se lo sviluppatore esegue l'enumerazione fortemente tipizzata su un numero intero o una stringa, non c'è nulla che la lingua o il framework possano fare per impedire a entrambi di essere uguali.

Per chiarire ulteriormente, non è possibile sovrascrivere MyEnum.Equals per fornire un metodo di uguaglianza diverso. Le enumerazioni net non sono dei cittadini di prima classe nelle versioni successive di Java, e mi auguro che C# consenta interazioni più ricche con Enums.

+1

fai attenzione qui, questo è vero solo se la posizione ordinale è la stessa. –

+1

grazie. Ma l'operatore! = NON è quello che sono afterm piuttosto equivale(). Anche i diversi tipi fortemente tipizzati possono essere uguali, ho pensato, o non è vero? – Peter

+0

@Peter: le enumerazioni sono strutture, inoltre, non è possibile sovraccaricare nessuno dei loro metodi. Inoltre ho usato! = Come più di un verbo che un vero frammento di codice. @Tim: in effetti, questo è solo per il suo caso e il suo caso. – user7116

0
public enum enumA {one = 1, two = 2} 

    public enum enumB {one = 1, two = 2} 

    [Test] 
    public void PreTest() 
    {      
     Assert.AreEqual((int)enumA.one, (int)enumB.one); 
     // I don't think this one will ever pass 
     Assert.AreSame(enumA.one, enumB.one); 
    } 
1

Se volete che corrispondono, li gettò a int

Assert.AreEqual((int)enumA.one,(int)enumB.one); 

passerebbe perché sono entrambi la prima elencati. Se vuoi che corrispondano perché entrambi dicono "uno", allora devi usare la riflessione.

+2

Penso che si possa fare questo, per verificare i valori della stringa: Assert.AreEqual (enumA.one.ToString(), enumB.one.ToString()); – Jonas

+0

o casting per filo ovviamente. – Peter

0

Si potrebbe provare loro fusione:

Assert.AreEqual((int)enumA.one, (int)enumB.one); 
1

Per essere onesti, l'uguaglianza non è diretta in avanti la maggior parte del tempo.

Sarei propenso a creare una classe helper che implementa IEqualityComparer (e qualsiasi altro test di uguaglianza, IsSame() per esempio) e usarlo.

3

vi rimando alla v3.0 C# Specifiche del linguaggio, da cui questa citazione è stata estratta dalla sezione Enum a pagina 29:

"Ogni tipo enum ha un corrispondente tipo integrale chiamato il tipo di fondo della tipo enum. Un tipo enum che non dichiara esplicitamente un tipo sottostante ha un tipo sottostante di int. Il formato di memoria di un tipo enum e l'intervallo di valori possibili sono determinati dal tipo sottostante.Il set di valori che un tipo di enum può assumere è non limitato dai membri di enum In particolare, qualsiasi valore del tipo sottostante di un enum può essere trasmesso al tipo enum ed è un valore valido distinto di quel tipo di enum."

Procedimento .AreEqual è veramente testando equivalenza mentre l'identità seconde prove. Così, semplicemente gettato ognuno al suo tipo sottostante (in questo caso, int) e poi fare il confronto.

public enum enumA { one, two } 
public enum enumB { one, two } 
[Test] 
public void PreTest() 
{ 
     Assert.AreEqual((int)enumA.one,(int)enumB.one); 
     Assert.AreSame(enumA.one, enumB.one); 
} 
+0

Tx, puoi fornire un link? – Peter

2

differenza Java, C# non fornisce alcuna struttura per l'aggiunta di metodi (come ad esempio operatore ==()) per un enum.

Quello che ho fatto in passato, quando ha bisogno di enumerazioni più intelligenti è creare una classe XHelper (dove X è il nome dell'enum), e ho messo tutti i metodi su di esso, quindi qualcosa del genere:

public static bool EnumAHelper.EqualsEnumB(EnumA enumA, EnumB enumB) 
{ 
    return (int)enumA == (int)enumB; 
} 

Tuttavia, non ricordo di aver trovato un caso in cui avevo bisogno di due enumerazioni diverse per indicare la stessa cosa.

+0

Nota molto buona (dopo). Sto riscrivendo una classe esistente che voglio essere compatibile, quindi anche le enumerazioni dovrebbero essere uguali. – Peter

Problemi correlati