2009-09-15 15 views
5

Mi chiedo se esiste un modo per impedire a enum di compilare le chiavi duplicate?Come evitare i valori duplicati in enum?

Per esempio questo enum sotto compilerà

public enum EDuplicates 
{ 
    Unique, 
    Duplicate = 0, 
    Keys = 1, 
    Compilation = 1 
} 

Anche se questo codice

Console.WriteLine(EDuplicates.Unique); 
Console.WriteLine(EDuplicates.Duplicate); 
Console.WriteLine(EDuplicates.Keys); 
Console.WriteLine(EDuplicates.Compilation); 

stamperà

Duplicate 
Duplicate 
Keys 
Keys 
+1

Ah le gioie di enumerazioni Java. :) – cletus

+1

Questo è C#. :-) –

+0

Vedere il seguente link per sapere perché 'Console.WriteLine (EDuplicates.Unique);' stampa 'Duplicate' http://stackoverflow.com/questions/530281/unexpected-result-when-using-enum-parse –

risposta

14

Questo non è vietato dalla specifica del linguaggio, in modo che qualsiasi conforme Compilatore C# dovrebbe permetterlo. Potresti sempre adattare il compilatore Mono per proibirlo - ma francamente sarebbe più semplice scrivere un test unitario per scansionare i tuoi assiemi per enumerarli e farli rispettare in questo modo.

+2

Probabilmente mi manca il punto qui: qual è lo scenario utile per sostenere questo? Se non ci sono scenari utili perché preferiresti scrivere test unitari per questo oltre a lasciare che il compilatore gestisca la situazione? –

+0

@Brian: per evitare di rompere il codice esistente. La compatibilità con le versioni precedenti è importante, così come conforme alle specifiche. Non riesco a pensare immediatamente a scenari utili, ma ciò non significa che vorrei rompere chiunque stia già usando questo. –

+6

@Brian: Può essere utile se per qualche ragione desideri cambiare il nome di un valore enum senza rompere il vecchio codice: aggiungi un nuovo valore con il nuovo nome e lo stesso valore numerico di quello vecchio e decora il vecchio valore con l'attributo 'Obsolete'. –

0
public bool ValidateAllDistinct(Type enumType) 
{ 
    return !Enum.GetNames(enumType).All(outerName 
     => Enum.GetNames(enumType).Any(innerName 
      => innerName == outerName 
       ? true 
       : Enum.Parse(enumType, innerName) != Enum.Parse(enumType, outerName))); 
} 

I metodo di prova semplice per il tuo unittest.

+0

Questo è qualcosa come il test unitario che ho dovuto scrivere con la sola differenza che sto stampando chiavi duplicate. – zzandy

+0

Secondo [questo] (https://dotnetfiddle.net/0KoChn), il violino non funziona. Per favore correggimi se ho perso qualcosa. – LosManos

9

Ecco un semplice test di unità che lo controlla, dovrebbe essere un po 'più veloce:

[TestMethod] 
public void Test() 
{ 
    var enums = (myEnum[])Enum.GetValues(typeof(myEnum)); 
    Assert.IsTrue(enums.Count() == enums.Distinct().Count()); 
} 
Problemi correlati