2015-04-01 108 views
-3

在弄乱枚举的同时,我发现了一个枚举的奇怪行为。是什么导致了这种枚举的奇怪行为?

考虑下面的代码:

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 
    } 

如果我运行相同的代码,相同的结果将apear(这是奇怪的,因为它是)。现在,如果我改变我的枚举是这样的:

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

我得到以下编译器错误:

无法隐式转换类型“字符串”到“廉政”。

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

+0

Enum是整数。当你看到一个单词'January'时,它的值为1.(或者你在第二个例子中指定的值为3)但它不能具有'g'的值。 – paqogomez 2015-04-01 17:31:01

+0

阅读http://stackoverflow.com/a/16039343/380384看看你可以用'enum'做什么。 – ja72 2015-04-01 17:35:14

回答

4

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

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

的语法是这样的:

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

你不能有一个非数字类型支持的枚举,如string

2

这是枚举如何在C#实现的,它们可以仅仅基于byteintlongshort(和他们的无符号类似物),则不能使用string为后盾类型。

相关问题