为什么枚举有两个不同的名称具有相同的数值?

And*_*dyM 27 c# enums

我刚刚发现了一个微妙的错误,我有一个枚举,两个名字无意中共享相同的数值(在这种情况下,红色= 10和深红色= 10).我有点惊讶这不是语法错误.

public enum Colour
{
    Red=10,
    Blue=11,
    Green=12,
    Crimson=10
}
// Debug.Write(Colour.Red==Colour.Crimson) outputs True
Run Code Online (Sandbox Code Playgroud)

是否有任何现实世界的理由为什么这种行为可能有用或者认为它应该是语法错误?

Rob*_*Day 38

public enum Colour
{
    Red=10,
    Rouge=10,
    Blue=11,
    Bleu=11,
    Green=12,
    Vert=12,
    Black=13,
    Noir=13
}
Run Code Online (Sandbox Code Playgroud)

  • 我不知道这是一个有效的答案. (57认同)
  • 你会怎么用?在多语言编程团队中,每个成员选择自己的常量? (10认同)
  • @Robin:就像@Noldorin一样,我看不出它是如何有用的.你能举个例子吗? (4认同)
  • Robin,好的,但OQ之所以没有被禁止,所以我们正在寻找一个_why_应该使用它的例子,而不是_how_. (3认同)
  • `如果需要使用它,就应该使用它.例如:我正在开发一个程序,它使用当前和以前的帧进行视频处理.我将以前的图像存储在一个数组中,并使用`enums`进行索引.在一种操作模式中,我需要"0"作为前一个图像,而在另一种模式中,我需要"0"作为左上图像,"1" - 右上等等,我可能需要0在未来的另一种模式的实现中成为其他图像.在这种情况下,我使用`enums`而不是`magic numbers`进行索引,我相信它会更干净. (2认同)

小智 26

谨防!如果您的enum多个元素具有相同的值,则在使用时可能会出现意外结果Enum.Parse().这样做会随意返回具有请求值的第一个元素.例如,如果你有enum Car { Ford = 1, Chevy = 1, Mazda = 1},那么(Car)Enum.Parse(typeof(Car), "1")将返回Car.Ford.虽然这可能有用(我不确定为什么会这样),但在大多数情况下,它可能会让人感到困惑(特别是对于维护代码的工程师),或者在出现问题时容易被忽视.


tan*_*ius 19

我已经看到此功能有时用于"默认"值:

public enum Scope
{
    Transient,
    Singleton,
    Default=Transient
}
Run Code Online (Sandbox Code Playgroud)

但要注意,这只是你的枚举用户的糖.仅仅因为它被称为默认,它并不意味着它是初始值.


wRA*_*RAR 10

枚举像constans一样使用,你肯定可以有两个具有相同值的常量,它们在相同的地方使用.它可能是因为第三方API,因为向后兼容性仅仅是因为业务规则.


etc*_*etc 7

来自c#语言规范:

多个枚举成员可以共享相同的关联值.这个例子

enum Color 
{
    Red,
    Green,
    Blue,
    Max = Blue
}
Run Code Online (Sandbox Code Playgroud)

显示一个枚举,其中两个枚举成员 - 蓝色和最大 - 具有相同的关联值.

在这种情况下,您可以检查MyColor == Color.Max,这在某些情况下会很有用.

  • Max是一个sentinal值的示例.根据MSDN枚举设计指南,建议不要这样做,因为它违反了原始值与其状态之间的关注点分离.如果需要改变被认为是Max的东西,那么期望Max总是等于Blue的任何参考都需要修复. (2认同)

Ars*_*yan 6

Enum 是常量变量的枚举,你可以有两个具有相同值的项目,我认为没有理由出现语法错误,但是,这会导致此代码中的编译错误

switch(c)
{
  Colour.Red:
     break;
  Colour.Crimson:
     break;
  ...
}
Run Code Online (Sandbox Code Playgroud)