导致这种奇怪行为的原因是什么?

时间:2015-04-01 17:27:14

标签: c# enums

在弄乱枚举时,我发现了一个奇怪的行为。

请考虑以下代码:

static void Main()
    {

        Console.WriteLine("Values");
        Console.WriteLine();
        foreach (Month m in Enum.GetValues(typeof(Month)))
        {
            Console.WriteLine(m.ToString());
        }
        Console.WriteLine();
        Console.WriteLine("Names");
        Console.WriteLine();
        foreach (var m in Enum.GetNames(typeof(Month)))
        {
            Console.WriteLine(m);
        }
        Console.ReadLine();
    }
    public enum Month
    {
        January,
        May,
        March,
        April
    }

此代码生成以下输出(按预期方式):

Values

January
May
March
April

Names

January
May
March
April

现在,让我说我改变了一点我的枚举,就像这样:

public enum Month
    {
        January = 3,
        May,
        March,
        April
    }

如果我运行相同的代码,相同的结果将会出现(这很奇怪)。现在如果我改变我的枚举:

public enum Month
    {
        January = "g",
        May,
        March,
        April
    }

我收到以下编译错误:

  

无法隐式转换类型'字符串'到' int'。

为什么编译器允许我将枚举值中的一个设置为3,而不是g?为什么第一个结果与第二个结果完全相同?如果我更改了1月的值,那么为什么GetValues不打印3?

3 个答案:

答案 0 :(得分:4)

默认情况下,枚举由int支持。它们只是附加到各种int值的标签。您可以让编译器选择哪个整数来映射每个枚举值,或者您可以明确地执行它。

除了int之外,您还可以创建由其他数字类型支持的枚举(例如bytelong)。

语法如下所示:

public enum Month : long
{
    January = 50000000000, //note, too big for an int32
    May,
    March,
    April
}

您不能使用非数字类型支持枚举,例如string

答案 1 :(得分:2)

这是枚举在C#中实施的方式,它们只能基于byteintlongshort(及其未签名的类似物) ),您不能使用string作为支持类型。

答案 2 :(得分:0)

因为枚举只有certain approved types,而int就是其中之一。