使用初始化式循环枚举会产生意想不到的结果



我创建的enum看起来像这样:

enum MonthOfTheYear : byte
{
    January,
    February,
    March,
    April,
    May,
    June,
    July = 0,
    August,
    September,
    October,
    November,
    December
}
如您所见,July的初始化项为0。这有一些有趣的(副作用)影响:整数值似乎存在"配对"。2月ànd 8月现在的值为1,3月ànd 9月有2等:
MonthOfTheYear theMonth = MonthOfTheYear.February;
Console.WriteLine(theMonth + " has integer value of " + (int)theMonth);

MonthOfTheYear theMonth = MonthOfTheYear.August;
Console.WriteLine(theMonth + " has integer value of " + (int)theMonth);

清楚地显示了这一点。到目前为止,尽管我觉得很奇怪,但我还是愿意接受。编辑:我得到分配7月0使索引重新开始。我不明白为什么它们可以在同一个enum中共存。

但是!如果然后循环遍历枚举并输出所有底层整数值,就会出现怪事。

MonthOfTheYear theMonth = MonthOfTheYear.January;
for (int i = 0; i < 12; i++)
{
    Console.WriteLine(theMonth + " has integer value of " + (int)theMonth++);
}

输出
July has integer value of 0
February has integer value of 1
September has integer value of 2
April has integer value of 3
May has integer value of 4
June has integer value of 5
6 has integer value of 6
7 has integer value of 7
8 has integer value of 8
9 has integer value of 9
10 has integer value of 10
11 has integer value of 11

我希望有人能向我解释幕后发生了什么,因为整数值是连续的,所以我认为这是按预期输出,但我还没有看到它。

首先,当您在枚举的定义中指定一个值时,后续值从那里连续编号—即使您在某处指定了0,第一个值也将从0开始编号。因此,您的基础byte值为:

enum MonthOfTheYear : byte
{
    January = 0, // not specified, so starts at 0
    February = 1,
    March = 2,
    April = 3,
    May = 4,
    June = 5,
    July = 0, // specified, so starts numbering from 0 again
    August = 1,
    September = 2,
    October = 3,
    November = 4,
    December = 5
}

当您使用++增加枚举值时,它只是增加底层byte -它查看enum的定义并转到下一行的元素!

如果这个byte没有相应的定义条目,这并不意味着它是无效的——只是,当你将枚举值转换为字符串时,你得到的byte值是字符串。

如果byte多个对应的定义条目…实际上,我不确定将它转换为字符串会给你哪个条目,但显然不一定是第一个。

基本上是MonthOfTheYear.February == MonthOfTheYear.August,所以无论你是在它上面调用ToString还是只是在调试器中查看它,都不能保证一个不会被另一个切换。

http://msdn.microsoft.com/en-us/library/system.enum.getname.aspx

如果多个枚举成员具有相同的基础值,则GetName方法保证它将返回其中一个的名称枚举成员。然而,它不能保证它会始终返回相同枚举成员的名称。因此,当多个枚举成员具有相同的值时应用程序代码永远不应该依赖于返回特定成员的名称。

所以,总结一下,当你有多个具有相同值的成员时,你为一个特定值获得的名称是任何具有该值的成员

使用

方法
Enum.GetName

下面是一个例子:

using System;
public class GetNameTest {
    enum Colors { Red, Green, Blue, Yellow };
    enum Styles { Plaid, Striped, Tartan, Corduroy };
    public static void Main() {
        Console.WriteLine("The 4th value of the Colors Enum is {0}", Enum.GetName(typeof(Colors), 3));
        Console.WriteLine("The 4th value of the Styles Enum is {0}", Enum.GetName(typeof(Styles), 3));
    }
}
// The example displays the following output:
//       The 4th value of the Colors Enum is Yellow
// 

你可以在这里得到完整的解释:

http://msdn.microsoft.com/de-de/library/system.enum.getname.aspx

您显式地将july设置为enum中的第一个月。这就把事情搞砸了。试试这个:

enum MonthOfTheYear : byte {
        January,
        February,
        March,
        April,
        May,
        June,
        July,
        August,
        September,
        October,
        November,
        December
    }
for (int i = 0; i < 12; i++) {
    Console.WriteLine(String.Format("{0} has integer value of {1}", Enum.GetName(typeof(MonthOfTheYear), i), i));
}

因为您将july设置为0,它将从该点开始重置索引器。如果您希望这种奇怪的顺序存在,请考虑重新安排枚举中的顺序。

相关内容

  • 没有找到相关文章

最新更新