如何防止枚举中的重复值?

我想知道有没有办法防止带有重复键的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 

这不是语言规范所禁止的,因此任何符合条件的C#编译器都应该允许它。 您总是可以调整Mono编译器以禁止它 – 但坦率地说,编写unit testing以扫描程序集中的枚举并以这种方式强制执行它会更简单。

这是一个简单的unit testing,检查它,应该更快一点:

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

unit testing,用于检查枚举并显示哪些特定枚举值具有重复:

 [Fact] public void MyEnumTest() { var values = (MyEnum[])Enum.GetValues(typeof(MyEnum)); var duplicateValues = values.GroupBy(x => x).Where(g => g.Count() > 1).Select(g => g.Key).ToArray(); Assert.True(duplicateValues.Length == 0, "MyEnum has duplicate values for: " + string.Join(", ", duplicateValues)); } 
 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))); } 

我的unit testing的简单测试方法。