枚举值应该在全球范围内是唯一的吗?

Should the Enum values be unique in the global scope?

我在 编程基础 课程中读到 enum 值应该是唯一的,有以下示例:

enum color = { red, orange, yellow };
enum fruit = { apple, orange, kiwi}; // error: orange is redefined
int kiwi = 42; // error: kiwi is redefined

我在这个问题上也发现了同样的想法:Two enums have some elements in common, why does this produce an error?

Enum names are in global scope, they need to be unique.


我在 Ubuntu 14.10 上用 MonoDevelop 编写 C# 应用程序,我试图重现此行为:

using System;

namespace FP
{
    class MainClass
    {
        enum color { red, orange, yellow };
        enum fruit { apple, orange, kiwi}; // error: orange is redefined
        int kiwi = 42; // error: kiwi is redefined
        public static void Main (string[] args)
        {
            Console.WriteLine ("Hello World!");
        }
    }
}

以上程序编译成功

这是已知的 MonoDevelop 行为还是为什么编译没有错误?枚举值在全局范围内是否应该是唯一的?

不,这不是错误,C# 应该是这样工作的。您链接到的问题是关于 C,而不是 C#。

在 C 中,所有枚举值都必须是唯一的,因为您可以在不指定它属于哪个枚举的情况下使用该值。这就是为什么那个问题中的例子没有编译。

在 C# 中,枚举值只需要在同一枚举中是唯一的。在 C# 中,您永远不会在不指定它属于哪个枚举的情况下使用枚举值,因此来自不同枚举的值不会冲突。

枚举值通常是唯一的,它试图使标识符具有描述性。如果您碰巧对不同枚举中的值使用相同的名称,那么这是有原因的。要么枚举密切相关,以至于它们在含义上重叠,要么有一个词具有多个含义。

你说的是c语言的行为。

c# 中,枚举不能通过名称全局访问,您始终必须通过 typeName.valueName 访问它们,例如color.Orangefruit.Orange。所以不会有冲突。事实上,许多内置枚举使用相同的值名称(StringSplitOptions.NoneCompareOptions.None)。