为什么没有非整数枚举?

时间:2009-03-23 03:02:24

标签: c# enums language-design

为什么无法创建非整数枚举?我想知道这是不是 是一种语言设计决策,或者如果在编译器中实现这一点,则存在问题。

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

有人告诉我,在C#中没有这个的原因或理由很简单,非常好。

4 个答案:

答案 0 :(得分:8)

没有技术上的原因导致它无法完成,但是,我们真的更多地谈论一组常量(如果它们是相关的,可能在一个共同的命名空间内)。

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

以下内容:

enum Fruit {
  Apple,
  Orange,
  Pear,
  Peach
}

我们只描述了一组命名常量。我们说的是Fruit类型的变量可以采用这四个值中的一个。每个的整数值是多少,实际上是不相关的。只要我只通过名称引用它们,代表Apple的值是0,1,32,-53还是0.002534f并不重要。

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

此外,枚举通常用于指定可与按位运算组合的可选标志。如果每个值都由一个整数表示(那么你只需要选择一个使用你想要的位模式的整数),这是微不足道的。 浮点值在此上下文中没有用处。 (逐位和/或操作对浮点值没有多大意义)

答案 1 :(得分:6)

我认为枚举是以这种方式制作的,因为与您想要做的相反,枚举并不意味着保留任何有意义的数字表示

例如,枚举非常适合描述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
}

我认为你明白了。底线是:枚举旨在表示难以用数字表示的对象或对象特征,或者没有有意义或实际的数字表示 - 因此任意赋值给整数,这对于这样的数据类型来说是最方便的数据类型。 p>

这与节假日相反,假日具有数字意义

答案 2 :(得分:4)

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

原始C没有这样做,因为它的目的(系统编程语言)是不必要的。 C ++没有这样做,因为它基于C,你可以用类来模拟它。出于同样的原因,C#可能不会这样做。

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

一旦你决定走上课程(DateTime),没有什么理由不去。如果你想使用枚举,你可以创建枚举为从零开始的连续整数,并使用这些枚举作为索引具有DateTime值数组。

但是我只有一个Holiday类,它在类中提供了整个kit和kaboodle:常量,get()例程,根据这些常量返回DateTime等等。

这为您提供了真正的封装以及在不影响接口的情况下完全实现实现的能力。为什么要抛弃OOP的一个好处呢?

答案 3 :(得分:2)

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

我想到的只是代表特定情况下可用的各种选项;不要实际存储数据。

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