我正在使用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
答案 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
,它将覆盖默认递增的值。