2

我创建的枚举如下所示:

enum MonthOfTheYear : byte
{
    January,
    February,
    March,
    April,
    May,
    June,
    July = 0,
    August,
    September,
    October,
    November,
    December
}

如您所见,July 的初始值设定项为 0。这有一些有趣的(副作用):似乎存在整数值的“配对”。二月和八月现在的值为 1,三月和九月的值为 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 日会使索引重新开始。我不明白为什么它们可以在同一个枚举中共存。

但!如果我然后循环遍历枚举并输出所有底层整数值,就会发生奇怪的事情。

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

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

4

4 回答 4

5

首先,当您在枚举的定义中指定一个值时,后续值将从那里连续编号 - 即使您指定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- 它不会查看 the 的定义enum并转到下一行的元素!

如果byte它没有对应的已定义条目,那并不意味着它根本无效 - 只是,当您将枚举值转换为字符串时,您会得到byte字符串形式的值。

如果byte几个相应的已定义条目...实际上,我不确定将其转换为字符串的确切条目会给您,但显然不一定是第一个。

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

于 2013-01-18T12:47:46.923 回答
1

使用方法

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

于 2013-01-18T12:46:26.253 回答
1

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

如果多个枚举成员具有相同的基础值,则 GetName 方法保证它将返回这些枚举成员之一的名称。但是,它不保证它总是返回同一个枚举成员的名称。因此,当多个枚举成员具有相同的值时,您的应用程序代码不应依赖于返回特定成员名称的方法。

因此,总而言之,当您有多个具有相同值的成员时,您为特定值获得的名称是具有该值的任何成员

于 2013-01-18T12:59:01.413 回答
0

您明确将 7 月设置为枚举中的第一个月。这把事情搞砸了。试试这个:

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 设置为零,所以它会从该点重置索引器。如果您希望这种奇怪的顺序到位,请考虑重新排列您的枚举中的顺序。

于 2013-01-18T12:52:33.767 回答