#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
.