2015-04-01 2 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 
    } 

Если я запустил тот же код, будут получены те же результаты (что странно, как есть). Теперь, если я изменю свое перечисление, как это:

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

Я получаю следующее сообщение об ошибке компилятора:

Не удается неявно преобразовать «строка» типа для «» междунар.

Почему компилятор позволяет мне установить одно из значений перечисления на 3, но не на g? И почему первый результат точно так же, как второй? Если я изменил значение января, то почему GetValues не печатает 3?

+0

Enum - целые числа. В то время как вы видите слово 'January', оно имеет значение 1. (Или 3, как вы его назначили в своем втором примере) Но оно не может иметь значение' g'. – paqogomez

+0

Прочитайте http://stackoverflow.com/a/16039343/380384, чтобы узнать, что вы можете сделать с помощью 'enum'. – ja72

ответ

4

По умолчанию перечисления снабжены int. Это просто метки, прикрепленные к различным значениям int. Вы можете либо позволить компилятору выбрать, какие ints должны сопоставлять каждое значение перечисления, или вы можете сделать это явно.

Вы также можете создавать перечисления, поддерживаемые другими числовыми типами, кроме int (например, byte или long).

Синтаксис будет выглядеть следующим образом:

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

Вы не можете иметь перечисление подкрепленная нечисловом типа, такие как string.

2

Это как перечисления реализуются в C#, они могут быть основаны только на byte, int, long, short (и их аналоги без знака), вы не можете использовать string как тип основы.

Смежные вопросы