为什么具有默认值的枚举在C#中无法正常工作?

时间:2017-06-07 11:08:07

标签: c# c#-4.0 enums

我正在使用C#Brain teasers http://www.yoda.arachsys.com/csharp/teasers.html的Jon双向飞碟网站。为什么项目“Baz”在输出中显示,即使我为枚举

中的所有项目声明了默认值

---例如:1

class Test
{

    enum Foo { Bar, Baz,bread, jam };

    const int One = 1;
    const int Une = 1;

    static void Main()
    {
        Foo f = 0;
        Console.WriteLine(f);
        Console.ReadLine();
    }
}
// output :Bar

- EG2

class Test
{
    enum Foo { Bar, Baz,bread=0, jam };

    const int One = 1;
    const int Une = 1;


    static void Main()
    {
        Foo f = 0;
        Console.WriteLine(f);
        Console.ReadLine();
    }
}
//output : Bar

- EG3

class Test
{
    enum Foo { Bar, Baz=0, bread=0, jam };

    const int One = 1;
    const int Une = 1;

    static void Main()
    {
        Foo f = 0;
        Console.WriteLine(f);
        Console.ReadLine();
    }
}
//output :Baz

- EG4

class Test
{
    enum Foo { Bar=0, Baz=0, bread=0, jam=0};

    const int One = 1;
    const int Une = 1;


    static void Main()
    {
        Foo f = 0;
        Console.WriteLine(f);
        Console.ReadLine();
    }
}
//output:Baz

3 个答案:

答案 0 :(得分:4)

枚举只是.NET的整数。只要您将它们视为名称(例如ToString()),您就实际上说“尝试找到与之匹配的已定义的枚举标签 整数值,告诉我那个名字。“在这种情况下,你有多个具有相同整数值的枚举标签,因此WriteLine中的哪个名称是未定义的。请注意WriteLine这里最终正在做f.ToString(),它应用了上面的“查找值”逻辑。

对于--eg5,我建议:Foo f = (Foo)-1327861;。在.NET术语中完全有效,但与任何枚举定义不匹配。它没有。

答案 1 :(得分:1)

您无法为枚举成员设置默认值,仅适用于整个枚举。它的默认值是0,它是枚举的第一个元素。其他枚举成员应该与该值不同,否则它们只是覆盖它。在这种情况下:

enum Foo { Bar=0, Baz=0, bread=0, jam=0 };

您对编译器说:好的,现在他们0将被命名为Bar。好的,现在0将被命名为Baz,依此类推。它对编译器没有任何意义。

在一本书Code Complete中,我们可以找到一个建议来介绍一个名为None的默认枚举成员,并明确地将其分配给0并将其放在枚举的第一个位置。所以,你的代码看起来像这样:

enum Foo
{
    None = 0,
    Bar, // 1
    Baz, // 2
    bread, // 3
    jam // 4
};

答案 2 :(得分:0)

考虑这个例子:

enum Foo { Bar, Baz,bread=0, jam=0};

public static void Main()
{
    Console.WriteLine((int)Foo.Bar);  // 0
    Console.WriteLine((int)Foo.Baz);  // 1
    Console.WriteLine((int)Foo.bread); // 0
    Console.WriteLine((int)Foo.jam);  // 0
}

所以我们可以说,如果我们不为枚举中的第一个项目分配任何整数值,则会为0分配,如果您指定了一些值,则下一个项目将为previous item value + 1,它将覆盖默认递增的值。

查看this Example