在弄乱枚举时,我发现了一个奇怪的行为。
请考虑以下代码:
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?
答案 0 :(得分:4)
默认情况下,枚举由int
支持。它们只是附加到各种int
值的标签。您可以让编译器选择哪个整数来映射每个枚举值,或者您可以明确地执行它。
除了int
之外,您还可以创建由其他数字类型支持的枚举(例如byte
或long
)。
语法如下所示:
public enum Month : long
{
January = 50000000000, //note, too big for an int32
May,
March,
April
}
您不能使用非数字类型支持枚举,例如string
。
答案 1 :(得分:2)
这是枚举在C#
中实施的方式,它们只能基于byte
,int
,long
,short
(及其未签名的类似物) ),您不能使用string
作为支持类型。
答案 2 :(得分:0)
因为枚举只有certain approved types,而int就是其中之一。