Помощник Enum в С# не дает ожидаемого результата

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

РЕДАКТИРОВАТЬ: type-> изменено на другое имя (спасибо, ребята, за внимание)

Помощник:

 public static T Convert<T>(this string str)
    {
        return (T)Enum.Parse(typeof(T), str, true);
    }

Значения перечисления:

public enum anothername
    {
        SmallText = 100,
        Number = 15,
        TextArea = 0,
        Bool = 0,
        Choices = 0,
    }

Мой тест:

 [Test]
        public void EnumGetStringFromEnumType()
        {
            //arrange
            var MaxLength = EnumHelper.Convert<anothername>("TextArea").ToString();

            //act

            //assert
            Assert.AreEqual("TextArea", MaxLength);


        }

РЕДАКТИРОВАТЬ:

Спасибо, удаление значений int решило это!

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

public enum anothername
    {
        SmallText = 100,
        Number = 15,
        TextArea,
        Bool,
        Choices,
    }

Тест 2:

[Test]
        public void EnumGetIntValueOrStringFromEnumType()
        {
            //arrange
            var MaxLength = EnumHelper.ToEnumSafe<anothername>("TextArea");

            //act

            //assert
            Assert.AreEqual(null, (int)MaxLength);

        }

У меня точно такая же проблема, когда я пытаюсь получить значения int, я получаю неправильные результаты... результат = 16


person Haroon    schedule 15.04.2011    source источник
comment
1) вы можете использовать имя, отличное от Типа, чтобы избежать путаницы; 2) ваш assert проверяет строку на соответствие вашему перечислению, опечатка?; 3) нет никакой разницы между TextArea, Bool и Choices, так как все они имеют базовое значение 0.   -  person Hans Kesting    schedule 15.04.2011
comment
Есть ли причина, по которой последние три типа имеют одинаковое значение? Перечисления должны иметь разные значения.   -  person Paulczy    schedule 15.04.2011
comment
Вероятно, не стоит использовать имя Type для вашего перечисления, так как оно конфликтует с System.Type. Может быть, попробуйте изменить это на MyType и посмотрите, работает ли он так, как ожидалось.   -  person CodeNaked    schedule 15.04.2011
comment
извините... Я просто переименовал его, пока писал! Отсутствие воображения ... в любом случае спасибо за внимание, причина, по которой у меня такое же значение, заключается в том, что я пытаюсь получить тип перечисления, и если тип тот, где я не проверяю проверку длины, я использую 0 в его место, похоже, это была очень плохая идея!   -  person Haroon    schedule 15.04.2011
comment
Кстати, Type немного сбивает с толку имя enum в этом тесте.   -  person satnhak    schedule 15.04.2011
comment
@ Ханс, мой тест проверяет строку да, но проблема не в этом, я удалил 0, и все работает!   -  person Haroon    schedule 15.04.2011


Ответы (1)


В перечислении есть повторяющиеся элементы с тем же базовым значением, что и TextArea (Bool и Choices). Хотя синтаксический анализ должен завершиться успешно, значение ToString в результирующем экземпляре перечисления не определено и может не равняться "TextArea", как ожидается в вашем утверждении.

Из Enum.ToString документация:

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

ИЗМЕНИТЬ:

В ответ на ваше редактирование попробуйте это утверждение:

var MaxLength = EnumHelper.ToEnumSafe<anothername>("TextArea");
Assert.AreEqual(anotherName.TextArea, MaxLength);

или если вы предпочитаете сравнивать базовый тип:

Assert.AreEqual((int)anotherName.TextArea, (int)MaxLength);

Похоже, у вас сложилось впечатление, что член перечисления не связан с базовым значением, если его значение не указано явно. Это не тот случай; все элементы перечисления связаны с базовым значением. Правила для «неявных» ассоциаций приведены (из спецификация языка):

• Если элемент перечисления является первым элементом перечисления, объявленным в типе перечисления, связанное с ним значение равно нулю.

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

person Ani    schedule 15.04.2011
comment
Вот что происходит. EnumHelper.Convert возвращает TextArea, но ToString возвращает Choices. - person John Kraft; 15.04.2011
comment
@Ani -› Как бы я поступил в случае, когда перечисление имеет значение, а перечисление не имеет значения? Должен ли я по-прежнему использовать Enum? - person Haroon; 15.04.2011
comment
Вы ищете перечисления nullable? Конечно, вы можете использовать обычное перечисление и иметь элемент «Неопределенный». Или я неправильно понял? - person Ani; 15.04.2011
comment
Как описано выше, если я не объявлю некоторые типы перечислений, я получу противоречивые результаты... Я еще раз отредактирую, чтобы показать пример... - person Haroon; 15.04.2011