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

zza*_*ndy 14 .net c# enums

我想知道有没有办法防止enum重复键编译?

例如,enum下面将编译

public enum EDuplicates
{
    Unique,
    Duplicate = 0,
    Keys = 1,
    Compilation = 1
}
Run Code Online (Sandbox Code Playgroud)

虽然这段代码

Console.WriteLine(EDuplicates.Unique);
Console.WriteLine(EDuplicates.Duplicate);
Console.WriteLine(EDuplicates.Keys);
Console.WriteLine(EDuplicates.Compilation);
Run Code Online (Sandbox Code Playgroud)

会打印

Duplicate
Duplicate
Keys
Keys
Run Code Online (Sandbox Code Playgroud)

Car*_*rra 20

这是一个简单的单元测试,检查它,应该更快一点:

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


Jon*_*eet 17

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

  • @Brian:如果您出于某种原因希望在不破坏旧代码的情况下更改枚举值的名称,则可能很有用:使用新名称添加新值,并使用与旧名称相同的数值,并使用旧值装饰旧值`过时`属性. (8认同)
  • 我可能在这里忽略了这一点:支持这个的有用场景是什么?如果没有有用的场景,你为什么更愿意为此编写单元测试,而不是让编译器处理这种情况? (2认同)

Vla*_*nko 5

用于检查枚举并显示哪些特定枚举值重复的单元测试:

[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));
}
Run Code Online (Sandbox Code Playgroud)

  • [Fact] 和 Assert.True 用于 xUnit 测试框架。 (2认同)