【问题标题】:Why no non-integral enums?为什么没有非整数枚举?
【发布时间】:2009-03-23 03:02:24
【问题描述】:

为什么不能创建非整数枚举?我想知道这是否 是一个语言设计决定,或者在编译器中实现它是否存在问题。

换句话说,在语言中实现非整数枚举是否可行,但没有正当的需要?或者,如果它不可行但合理,有什么障碍?

请有人告诉我在 C# 中没有此功能的原因或理由是什么,非常感谢。

【问题讨论】:

  • 呃,我不得不删除一个示例,因为您选择尝试为示例找到解决方法,当我的问题明确表示我不是在寻找解决方法时,我正在寻找对设计的洞察力决定。继续前进吧。
  • 编辑您的问题有什么问题?澄清它是因为一些答案误解了它对我来说似乎完全公平。这绝对比留下一个含糊不清的问题要好。
  • 顺便说一句,到目前为止,这个问题只编辑过一次。我认为这几乎不会“不断变化”。
  • 我只是重构我的问题以消除错误! :)
  • 攻击性的?伙计们,我不这么认为。

标签: c# enums language-design


【解决方案1】:

没有技术上的原因不能做到这一点,但是,我们实际上更多的是在谈论一组常量(如果它们相关,可能在一个公共命名空间内)。

在枚举中,数值通常是次要的。

如下:

enum Fruit {
  Apple,
  Orange,
  Pear,
  Peach
}

我们只是描述了一组命名常量。我们是说 Fruit 类型的变量可以采用这四个值之一。每一个的整数值是什么,真的不相关。只要我只是通过名称来引用它们,代表 Apple 的值是 0、1、32、-53 还是 0.002534f 都没有关系。

大多数语言都允许您指定代表每种语言的值,但这实际上是次要的。它有时很有用,但它不是枚举核心目的的一部分。它们只是为您提供一组相关的命名常量,而无需为每个常量指定一个整数 ID。

此外,枚举通常用于指定可以与按位运算结合的可选标志。如果每个值都由一个整数表示,那实现起来很简单(那么你只需要选择一个使用你想要的位模式的整数)。 浮点值在这种情况下没有用。 (按位和/或运算对浮点值没有多大意义)

【讨论】:

    【解决方案2】:

    我认为枚举是这样制作的,因为与您想要做的相反,枚举并不意味着包含任何有意义的数字表示

    例如,枚举非常适合描述 ff:

    enum Color
    {
       Black,
       White,
       Red,
       Yellow,
       Blue,
       //everything else in between
    }
    

    (诚然,颜色可以用数字表示复杂类型,但暂时请放纵我)。心情怎么样?

    enum Mood
    {
        Happy,
        Giddy,
        Angry,
        Depressed,
        Sad
    }
    

    还是味道?

    enum Taste
    {
        Bitter,
        Salty,
        Sweet,
        Spicy
    }
    

    我想你明白了。底线是:枚举旨在表示难以用数字表示的对象或对象特征,或者没有有意义或实用的数字表示 - 因此任意分配给整数是最方便的数据类型。

    这与假期等具有数字意义的事物相反

    【讨论】:

      【解决方案3】:

      只有语言的设计者可以告诉你为什么他们不允许非整数枚举,但我可以告诉你最可能的解释。

      最初的 C 没有这样做,因为它对于它的目的(一种系统编程语言)来说是不必要的。 C++ 没有这样做,因为它是基于 C 的,无论如何你都可以用类来模拟它。出于同样的原因,C# 可能不会这样做。

      这只是我的猜测,因为我没有参与任何这些语言的设计。

      一旦您决定走课程(日期时间)的道路,就没有理由不一路走下去。如果要使用枚举,可以将枚举创建为从零开始的连续整数,并使用这些枚举作为索引来创建一个 DateTime 值数组。

      但我只需要一个 Holiday 类,它在该类中提供了整个工具包和 kaboodle:常量、基于这些常量返回 DateTime 的 get() 例程等等。

      这为您提供了真正的封装,并且能够在不影响接口的情况下完全改变实现。为什么要抛弃 OOP 的其中一项好处?

      【讨论】:

        【解决方案4】:

        在不知道实际答案的情况下,我建议更多的是后者 - 没有真正正当的需要。

        在我看来,枚举只是代表特定情况下可用的各种选项;不实际存储数据。

        不应将保存枚举值的变量视为保存值 1 或 2 或 3,即使这些是存储在该内存位置中的实际值。它应该被认为是代表星期一、星期二或星期三(例如)。它仅在该枚举方面具有意义,并且确实不应该(尽管经常这样做)以其他方式使用。您对 Enum 值执行的操作只是通过 Enum 实现方式提供的编程快捷方式。

        【讨论】:

        • 是否可以在 C 中定义能够参与常量表达式但也遵守正常范围规则的浮点常量(就像枚举定义一样,而#define 宏不)?为此目的使用“枚举”,即使是整数,也有点恶心,但#define 也有点恶心。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-07
        • 2010-12-08
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多