Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: HaroonОтветов: 1

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

РЕДАКТИРОВАТЬ: 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

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

enums

Ответы

Ответ 1 · рейтинг 7 · Ani

В перечислении есть повторяющиеся элементы с тем же базовым значением, что и 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);

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы