C# 枚举值在全局范围内是否应该是唯一的?

C# 枚举值在全局范围内是否应该是唯一的?,c#,enums,monodevelop,C#,Enums,Monodevelop,我在编程基础课程中读到,enum值应该是唯一的,具有以下示例: enum color = { red, orange, yellow }; enum fruit = { apple, orange, kiwi}; // error: orange is redefined int kiwi = 42; // error: kiwi is redefined 我在这个问题上也发现了同样的想法: 枚举名称在全局范围内,它们必须是唯一的 我在Ubuntu 14.10上用MonoDevelop编写C

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

enum color = { red, orange, yellow };
enum fruit = { apple, orange, kiwi}; // error: orange is redefined
int kiwi = 42; // error: kiwi is redefined
我在这个问题上也发现了同样的想法:

枚举名称在全局范围内,它们必须是唯一的


我在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行为,还是编译时没有错误?枚举值在全局范围内是否应该是唯一的?

不,这不是一个bug,这就是C#应该如何工作的。你链接到的问题是关于C,而不是C

在C语言中,所有枚举值都必须是唯一的,因为您可以使用该值,而无需指定它所属的枚举。这就是为什么这个问题中的例子没有编译

在C#中,枚举值仅在同一个枚举中必须是唯一的。在C#中,如果不指定枚举值所属的枚举,则永远不会使用该枚举值,因此来自不同枚举的值不会冲突


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

您所谈论的是
c
语言的行为


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

您链接的问题是
c
问题,而不是
c
问题。《编程基础》讲的是c还是c?@HugoRune哦,我们在学c,但这门课可能是关于c的。对不起,给你添麻烦了。C++11引入了
enum类
,以解决C风格enum的这个和其他缺点;不是有效的C语法,因此不能是C。是的,有效的C语法是
enum color{red,orange,yellow}(没有
=
令牌)