为什么没有非整数枚举?

cor*_*ore 6 c# enums language-design

为什么不能创建非整数枚举?我想知道这是一个语言设计决策,还是在编译器中实现这个问题.

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

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

jal*_*alf 8

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

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

在下面的:

enum Fruit {
  Apple,
  Orange,
  Pear,
  Peach
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Jon*_*jap 6

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

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

enum Color
{
   Black,
   White,
   Red,
   Yellow,
   Blue,
   //everything else in between
}
Run Code Online (Sandbox Code Playgroud)

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

enum Mood
{
    Happy,
    Giddy,
    Angry,
    Depressed,
    Sad
}
Run Code Online (Sandbox Code Playgroud)

还是品尝?

enum Taste
{
    Bitter,
    Salty,
    Sweet,
    Spicy
}
Run Code Online (Sandbox Code Playgroud)

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

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


pax*_*blo 4

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

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

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

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

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

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