Значения перечисляемых типов

#c# #enums

#c# #перечисления

Вопрос:

Мне просто интересно, почему я получаю этот вывод :

 enum MyEnum
{
    a=1,
    b=2,
    c=3,
    d=3,
    f=d
}
Console.WriteLine(MyEnum.f.ToString());
 

ВЫВОД
c

Но в монофоническом
ВЫВОДЕ

f

Итак, почему вывод c? не d? Как компилятор выбирает c? Если я изменю код следующим образом:

 enum MyEnum
{
    a=1,
    b=2,
    c=3,
    d=3, 
    k=3
}
Console.WriteLine(MyEnum.k.ToString());
 

ВЫВОД

c

снова!

Другой пример:

 enum MyEnum
{
    a=3,
    b=3,
    c=3,      
    d=3,
    f=d,   
}
MessageBox.Show(MyEnum.f.ToString());
 

ВЫВОД

c

Комментарии:

1. очень хороший вопрос, я и сам удивляюсь. возможно, потому, что это первое?

2. Просто чтобы быть уверенным: вы знаете, что вы также присвоили «c» значение 3 …?

3. я понятия не имею, может быть, из-за его первого, но я хочу углубиться

4. 1 хороший вопрос, я жду, чтобы узнать мотив.

5. Вы тестировали это на Mono? Это звучит как истинное поведение компилятора. В вашем первом примере я получил f вместо c

Ответ №1:

Из MSDN:

Если несколько элементов перечисления имеют одинаковое базовое значение, и вы пытаетесь получить строковое представление имени элемента перечисления на основе его базового значения, ваш код не должен делать никаких предположений о том, какое имя вернет метод.

См.: http://msdn.microsoft.com/en-us/library/a0h36syw.aspx#Y300

Комментарии:

1. Кажущаяся случайность, при которой выбирается имя перечисления, заключается в том, что ToString() для перечисления без [Flags] атрибута используется двоичный поиск для эффективного поиска первого имени перечисления с указанным значением.

Ответ №2:

Результатом является c, потому что toString разрешает индекс перечисления и выводит представление по этому индексу. В первом примере d = 3, а третье индексированное значение перечисления равно c . Аналогично, при поиске третьего индекса для k он достигает c перед k, так что это снова результат.

Комментарии:

1. Это не кажется точным. Это enum MyEnum {a=1,b=2,c=3,d=2,f=d} , согласно вашему объяснению, должно печататься b , и оно печатает f

2. Технически это на самом деле не так индексируется. Так получилось, что первое имя, которое видят методы, которое имеет то же значение, оказывается c .

3. Это не так, как это работает.. это просто произошло в этом примере. Попробуйте a=3, b=3, c=7, d=3, f=d . Выводится на печать f . Установите c=2 , и он будет распечатан d .