Неожиданный результат при использовании Enum.Parse () - PullRequest
3 голосов
/ 10 февраля 2009
class Program
{
    static void Main(string[] args)
    {
        String value = "Two";
        Type enumType = typeof(Numbers);
        Numbers number = (Numbers)Enum.Parse(enumType, value);
        Console.WriteLine(Enum.Parse(enumType, value));
    }

    public enum Numbers : int
    {
        One,
        Two,
        Three,
        Four,
        FirstValue = 1
    }
}

Это упрощенная версия перечисления, которое я использую в приложении. Причина, по которой некоторые имена enum не имеют значения, заключается в том, что я выполняю Enum.Parse с их именами в качестве аргумента, а имена со значением анализируются из int.

Если бы вы пошагово выполнили приведенный выше код и исследовали переменную 'number', вы бы увидели, что на самом деле это 'Two', но вывод в консоли - 'FirstValue'. На данный момент я не понимаю, почему, а?

Хорошо, решение простое - просто присвойте бесценным перечислениям значение. Но мне все еще любопытно.

Ответы [ 2 ]

10 голосов
/ 10 февраля 2009

Я подозреваю, что оба значения FirstValue и Two имеют внутреннее значение 1, поэтому система не знает, какую строку вывести.

public enum Numbers : int
{
    One, // defaults to 0
    Two, // defaults to 1
    Three, // defaults to 2
    Four, // defaults to 3
    FirstValue = 1 // forced to 1
}

Для каждого значения перечисления существует уникальное целочисленное значение, но для каждого целого значения не существует уникального значения перечисления.

Когда вы анализируете "two", он сохраняется внутри как целое число 1. Затем, когда вы попытаетесь преобразовать его обратно в строку, в зависимости от метода, используемого для поиска этого имени, вы можете получить либо "Two", либо "FirstValue". Как вы заявили, решение состоит в том, чтобы дать каждому перечисляемому значению определенное целочисленное значение.

2 голосов
/ 10 февраля 2009

Вот интересный поворот вашей проблемы, попробуйте следующий Enum ...

public enum Numbers : int
{
    One,
    Two,
    Four,
    FirstValue = 1
}

Консоль .WriteLine (...) теперь будет печатать «Два»!

И Two, и FirstValue представляют одно и то же число 1, но фактическое значение зависит от того, как число было преобразовано в его строковое представление, и наоборот.

Класс Enum использует отражение, чтобы получить имена чисел, а затем сохраняет их в массивах, но сортирует все это до того, как это делает. Затем Enum.ToString () выполняет двоичный поиск по отсортированным значениям, чтобы получить строковое представление. Благодаря тому, как это сделано, вы можете получить другой результат в зависимости от количества элементов, перечисленных в перечислении!

Теперь, что касается значения, "видимого" в VS, я подозреваю, что визуализатор отладчика для перечислений использует собственный алгоритм, который исправляет (?) Эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...