【问题标题】:Enums, overlapping values, C#枚举、重叠值、C#
【发布时间】:2011-10-07 10:10:00
【问题描述】:

提前道歉,因为我确定之前一定有人问过这个问题,但我找不到。

刚刚有一个惊喜,我和一位同事都为一个枚举添加了相同的值,并且它编译了,例如

  enum MyEnum
  {
    mine = 1,
    his = 1
  }

看起来 C/C++ 也支持这个(?)。这种行为的任何原因,它有用的任何情况?我看到了一个不同人类语言的案例(one = 1,eins = 1 等),但我不相信

谢谢

【问题讨论】:

  • 所以也许你可以这样做enum MyEnum { [Obsolete]mine = 1, his = 1 }
  • 大概,如果您明确表示值,您关心这些值是什么,因此不应发生此类冲突。如果你不关心每个成员代表什么价值,你可以不让它们显式并且不会发生冲突。

标签: c# c++ c enums


【解决方案1】:

我们举个简单的例子

enum PrivilegeLevel
{
    None,
    Reporter,
    Reviewer,
    Admin,
    DefaultForNewUser = None,
    DefaultForProjectOwner = Reviewer,
};

【讨论】:

  • 听起来是个坏主意,因为常量的二进制版本语义。
  • @crazyjul 常量不能被版本化。如果您更改一个常量(请参阅,这是一个矛盾的说法),所有使用它的程序集现在都将被破坏,因为它们仍然使用旧值。您不会更改 pi 的值,对吗?但您可能想要更改默认权限级别。
【解决方案2】:

枚举类型背后的想法是创建新的数据类型,这些数据类型只能采用>受限范围的值。

你所做的是合法的,编译器不应该给出任何错误,因为枚举只是一个常量。你只是给你的常数一个合乎逻辑的名字。

当您需要分隔命名常量时,您可以为两个或多个枚举常量分配相同的值。假设您有一个配色方案,两者都使用了相同的基本颜色,但方案需要在逻辑上分开。然后您可以对枚举常量使用相同的值。但是仍然有更好的方法来做到这一点。

【讨论】:

  • "如果将相同的值分配给两个或多个枚举常量,则枚举的全部用途就会减弱。"我不同意。枚举的全部目的是让您使用名称而不是幻数。我不明白有两个名字和相同的幻数是多么糟糕。
  • @R.MartinhoFernandes:我完全同意你的不同意见。有时别名是件好事。
  • 我估计不比c++ typedef差,当时只是惊讶
猜你喜欢
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2010-11-03
相关资源
最近更新 更多