2009-09-15 8 views
5

Zastanawiasz się, czy istnieje sposób, aby zapobiec kompilacji duplikatów kluczy enum?Jak zapobiec powielaniu wartości w wyliczaniu?

Na przykład ten enum poniżej skompilować

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

Chociaż ten kod

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

wypisze

Duplicate 
Duplicate 
Keys 
Keys 
+1

Ah radości teksty stałe Java. :) – cletus

+1

To jest C#. :-) –

+0

Zobacz poniższy link, aby dowiedzieć się, dlaczego 'Console.WriteLine (EDuplicates.Unique);' wypisuje 'Duplicate' http://stackoverflow.com/questions/530281/unexpected-result-when-using-enum-parse –

Odpowiedz

14

nie jest to zabronione przez specyfikację języka, więc każdy conformant C# kompilator powinien pozwól na to. Zawsze można zautomatyzować kompilator Mono, aby tego zabronić - ale, szczerze mówiąc, łatwiej byłoby napisać test jednostkowy, aby zeskanować swoje zestawy do wyliczenia i wymusić je w ten sposób.

+2

Prawdopodobnie brakuje mi tutaj tego punktu: Jaki jest przydatny scenariusz do wspierania tego? Jeśli nie ma użytecznych scenariuszy, dlaczego wolisz pisać testy jednostkowe dla tego, pozwalając kompilatorowi obsłużyć sytuację? –

+0

@Brian: Aby uniknąć złamania istniejącego kodu. Zgodność wsteczna jest ważna, ponieważ jest zgodna ze specyfikacją. Nie mogę od razu wymyślić żadnych użytecznych scenariuszy, ale to nie znaczy, że chciałbym złamać każdego, kto już to robi. –

+6

@Brian: Może być przydatne, jeśli z jakiegoś powodu chcesz zmienić nazwę wartości wyliczeniowej bez zerwania starego kodu: dodaj nową wartość z nową nazwą i taką samą wartością liczbową jak stara i udekoruj starą wartość z atrybutem "Przestarzałe". –

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 prosta metoda testowa dla twojego unittest.

+0

To jest coś w rodzaju testu jednostkowego, który musiałem napisać z tą różnicą, że drukuje duplikaty kluczy. – zzandy

+0

Zgodnie z [tym] (https://dotnetfiddle.net/0KoChn) skrzypce to nie działa. Proszę mnie poprawić, jeśli coś przeoczyłem. – LosManos

9

Oto prosty test, który sprawdza go jednostka powinna być nieco szybciej:

[TestMethod] 
public void Test() 
{ 
    var enums = (myEnum[])Enum.GetValues(typeof(myEnum)); 
    Assert.IsTrue(enums.Count() == enums.Distinct().Count()); 
} 
Powiązane problemy