2009-09-15 42 views
5

我不知道是否有一種方法可以防止帶有重複鍵的enum編譯?如何防止枚舉中的重複值?

例如下面這個enum將編譯

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

儘管此代碼

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

將打印

Duplicate 
Duplicate 
Keys 
Keys 
+1

阿的Java枚舉的樂趣。 :) – cletus 2009-09-15 08:02:05

+1

這是C#。 :-) – 2009-09-15 08:18:36

+0

請參閱以下鏈接以瞭解爲什麼'Console.WriteLine(EDuplicates.Unique);'打印'Duplicate' http://stackoverflow.com/questions/530281/unexpected-result-when-using-enum-parse – 2009-09-15 11:58:55

回答

14

這不是由語言規範禁止的,所以任何符合性C#編譯器應該是允許。你總是可以使用Mono編譯器來禁止它 - 但坦率地說,編寫一個單元測試來掃描你的程序集以獲得枚舉並且以這種方式執行它會更簡單。

+2

我可能在這裏忽略了一點:支持這一點的有用場景是什麼?如果沒有有用的場景,爲什麼你更願意編寫單元測試來讓編譯器處理這種情況? – 2009-09-15 08:10:29

+0

@Brian:爲了避免破壞現有的代碼。向後兼容性非常重要,因爲符合規範。我不能立即想到任何有用的場景,但這並不意味着我想打破已經使用過這種場景的人。 – 2009-09-15 08:18:25

+6

@Brian:如果你出於某種原因希望更改枚舉值的名稱而不破壞舊代碼,那麼它會很有用:使用新名稱和與舊數值相同的數值添加新值,然後修飾舊值與'Obsolete'屬性。 – 2009-09-15 08:20:07

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))); 
} 

我簡單的測試方法爲你的unittest。

+0

這就像我不得不寫的單元測試,只是差別在於打印重複鍵。 – zzandy 2009-09-15 08:41:50

+0

按照[this](https://dotnetfiddle.net/0KoChn)小提琴不起作用。如果我錯過了某些東西,請糾正我。 – LosManos 2016-08-10 13:07:10

9

下面是檢查它一個簡單的單元測試,應該是快了一點:

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