Поведение перечисления в c #

 class MainClass
{
    static void Main(String[] args)
    {
        Fruits f =Fruits.Banana;
        Console.WriteLine("Fruit={0}",f);
        Console.Read();
    }

    private enum Fruits
    {
        Banana=0,
        Apple=0,
        Orange=0,
        Cherries
    }

}

The above code gives output: Fruit=Apple

Если я изменю значение Бананы на что-либо, кроме 0 в enum, выход будет бананом. Мой вопрос в том, почему в первом случае вывод Apple , а не Orange или Banana )?

1
nl ja de
просто для проверки его поведения, я все еще на предварительном этапе обучения C#, просто развлекаюсь с кодом.
добавлено автор Victor Mukherjee, источник
@HenkHolterman: можете ли вы сказать, какое значение, кроме 0, не дает банану?
добавлено автор Victor Mukherjee, источник
Я отвечу вопросом. В чем смысл наличия трех разных элементов в Enum одинакового значения?
добавлено автор Oded, источник
Конечно, но когда вы делаете что-то подобное, удивляетесь ли вы, что результаты несколько странные?
добавлено автор Oded, источник
ничего, кроме 0 в пределах enum, выход - Banana . Я сомневаюсь, что, пожалуйста, проверьте.
добавлено автор Henk Holterman, источник
Ну, 1 даст вишня (я думаю) и 2 просто даст 2
добавлено автор Henk Holterman, источник
Но это просто злоупотребление/неправильное понимание перечислений.
добавлено автор Henk Holterman, источник
Я думаю, что они основывают его в алфавитном порядке.
добавлено автор mdcuesta, источник

2 ответы

Почему ты так делаешь? В любом случае, это потому, что внутри, enum s с одинаковым значением выбираются в алфавитном порядке.

2
добавлено
У вас есть ссылки, которые это задают? Я пробовал код и знаю, что это поведение, но не нашел никакой соответствующей документации
добавлено автор ryadavilli, источник

Внутренне перечисление очень похоже на struct с одним внутренним полем - с тем же типом, что и базовый тип для перечисления (здесь int )), который сохраняет значение ,

Это все, что касается перечисления. Он не имеет никакого хранилища ни для чего другого - он не знает , как он был создан - будь то с использованием именованного значения из перечисления, или путем литья из базового типа или любого другого средства.

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

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


Фактически, Enum.ToString() говорит:

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

2
добавлено
Конечно, это имеет смысл. Затем я должен ожидать, что любой из бананов, Apple или Orange появится в качестве вывода, я запускаю код несколько раз, но каждый раз, когда он производит Apple.
добавлено автор Victor Mukherjee, источник
@VictorMukherjee - он, вероятно , всегда возвращает Apple на данный момент. Но предупреждение заключается в том, чтобы не предположить , что это всегда будет так - возможно, в будущем они изменят, как перечисления работают в глубине CLR, и он начнет возвращать случайные значения, или всегда Оранжевый .
добавлено автор Damien_The_Unbeliever, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot