6

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

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

有人告诉我在 C# 中没有这个功能的原因或理由是什么,非常拜托。

4

4 回答 4

9

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

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

在下面的:

enum Fruit {
  Apple,
  Orange,
  Pear,
  Peach
}

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

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

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

于 2009-03-23T03:17:19.417 回答
7

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

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

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

这与假期之类的东西相反,后者在数字上是有意义的

于 2009-03-23T03:19:51.953 回答
4

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

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

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

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

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

这为您提供了真正的封装以及完全更改实现而不影响接口的能力。为什么要抛弃 OOP 的好处之一?

于 2009-03-23T03:17:53.177 回答
2

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

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

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

于 2009-03-23T03:17:55.280 回答