Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: enum  (Прочитано 12632 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimyan
Гость
« : 22-01-2004 11:25 » 

Можно ли и если можно то как создать символьное перечесление (enum)?
Для примера (если я не правильно выразился), из BCB:
Код:
enum MyEnum
{
cbA='A',
cbB='B',
cbC='C',
cbD='D',
cbE='E',
cbF='F',
         }
« Последнее редактирование: 23-11-2007 19:09 от Алексей1153++ » Записан
Alf
Гость
« Ответ #1 : 22-01-2004 11:52 » 

Смотрим MSDN, C# Language Specification, раздел 14 Enums:
Цитата
An enum declaration may explicitly declare an underlying type of byte, sbyte, short, ushort, int, uint, long or ulong. Note that char cannot be used as an underlying type.

Как видишь, низзя, явно оговорено. Впрочем, если преобразовать char во что-нибудь более подходящее (например, ushort, то почему бы и нет?
Только не забудь при этом, что char в BCB и C# - две большие разницы, поскольку в последнем используется Unicode, и результат может не совпасть с желаемым.
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #2 : 22-01-2004 23:05 » 

Dimyan, вместо типа char используй byte. Правда, придется помучиться с преобразованием типов, но другого пути действительно нет - перечисления строятся только на основе целочисленных типов...  Жаль
Записан
Alf
Гость
« Ответ #3 : 23-01-2004 07:29 » 

Цитата: Archangel
Dimyan, вместо типа char используй byte. Правда, придется помучиться с преобразованием типов, но другого пути действительно нет - перечисления строятся только на основе целочисленных типов...  Жаль
Читаем MSDN:
Цитата
Ключевое слово char используется для объявления символа  Unicode. Символы Unicode - это 16-битные символы, используемые для представления большинства известных письменных языков в мире.
И еще:
Цитата
Преобразования.
Сhar может быть неявно преобразован в ushort, int, uint, long, ulong, float, double или decimal. Неявных преобразований из других типов в тип char нет.

Так что, боюсь,  ничего хорошего из преобразования 16-битного char в 8-битный byte не выйдет. Осмелюсь повторно рекомендовать ushort как наиболее подходящий в данном случае.
Записан
Dimyan
Гость
« Ответ #4 : 24-01-2004 05:04 » 

Я разобрался, можно
enum MyEnum
   {
      cbA='A',
      cbB='B',
      cbC='C',
      cbD='D',
      cbE='E',
      cbF='F',
         }
в IL  в коды преобразовываются, а потом их просто в char преобразовывать при использывани:

(char)MyEnum.cbA
Записан
Alf
Гость
« Ответ #5 : 24-01-2004 23:34 » 

Dimyan, тут некоторые нюансы имеются...
Изначально вопрос был поставлен так:
Цитата
Можно ли и если можно то как создать символьное перечесление (enum)?
Четкий и однозначный ответ на это дает MSDN: тип char не может быть использован в качестве базового для enum. И это факт, с которым не поспоришь.
Почему же код, приведенный тобой, компилируется без ошибок и работает, нет ли тут противоречия с MSDN? Выяснить это очень просто. Достаточно выполнить маленький фрагмент кода:
Код:
...
MyEnum n;
n = MyEnum.cbA;
Console.WriteLine(n.GetType().Name);
Console.WriteLine(n.GetTypeCode().ToString());
...
Видим на экране результат его выполнения:
Код:
MyEnum
Int32
Первая строка - это имя типа переменной n. Как и ожидалось, это MyEnum.
Вторая строка - это имя типа, на котором базируется переменная n, а именно - Int32, а никак не Char. Так что вместо символьного перечисления получилось целочисленное, отсюда и необходимость в дальнейшем явного преобразования в char.
Может немного запутать то, что конструкция вроде
Код:
cbA='A'
работает без ошибок. Но и это неудивительно, поскольку cbA базируется на типе Int32, к которому тип char приводится неявно (выше я приводил цитату из MSDN).

Итак, резюме: ответ на поставленный вопрос - отрицательный: нет, символьное перечисление создать нельзя. Но можно взамен создать целочисленное перечисление, задать ему значения кодов нужных символов, а в процессе работы приводить коды в символьный тип посредством явного задания (char).
« Последнее редактирование: 23-11-2007 19:10 от Алексей1153++ » Записан
Dimyan
Гость
« Ответ #6 : 25-01-2004 07:40 » 

Alf,  ну не придирайся, ведь главное в вопросе подразумевается (как мне кажется в любом вопросе), это: "Если ответ на вопрос: НЕТ, то как из этой ситуации выйти!"
Выход найден, а это и была цель!!!
Записан
Alf
Гость
« Ответ #7 : 25-01-2004 15:03 » 

Dimyan, меня уговорить легко, я сговорчивый  Улыбаюсь
А вот с компилятором будет потруднее. Если сказано - char недопустим, так тому и быть. Кстати, совет, как выкрутиться из этой ситуации, содержался в первом же сообщении по теме:
Цитата
Впрочем, если преобразовать char во что-нибудь более подходящее (например, ushort, то почему бы и нет?
А насчет придирчивости - извиняй, если что не так. Мне почему-то показалось, что тебе будет интересно в самом механизме разобраться, а запихать несолько кодов буковок в перечисление - не самоцель.
Записан
Dimyan
Гость
« Ответ #8 : 26-01-2004 13:38 » new

Alf,  а мне очень интересно!!!
И большое тебе спасибо за разяснение  Ага
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines