Я хочу знать, почему мы не можем иметь char "в качестве основного типа перечисления. Поскольку у нас есть байт, sbyte, int, uint, long, ulong, short, ushort как основной перечислимый тип. Во-вторых, что является типом переименования по умолчанию?
Почему у нас не может быть типов "char"
Ответ 1
Тип по умолчанию - int. Более подробную информацию можно найти на ссылке С# в MSDN. Вы также можете найти ссылку на спецификацию языка С# в MSDN. Я думаю, что причина ограничения, вероятно, вытекает из этих утверждений в спецификации языка, раздел 4.1.5.
Тип char классифицируется как интегрального типа, но он отличается от другие интегральные типы двумя способами:
• Нет никаких неявных преобразований от других типов до типа char. В особенно, несмотря на то, что шбайт, байт, а также типы ushort имеют диапазоны значения, полностью представимые используя тип char, неявный конверсии из sbyte, byte или ushort до char не существует.
• Константы типа char должны быть написанных как символьно-литературные или как целые литералы в сочетании с введите тип char. Например, (char) 10 совпадает с "\ x000A".
Ответ 2
Я знаю, что это старый вопрос, но эта информация была бы полезной для меня:
Похоже, что без использования char в качестве типа значения для перечислений в С#.NET 4.0 (возможно, даже 3.5, но я не тестировал это). Вот что я сделал, и он полностью работает:
public enum PayCode {
NotPaid = 'N',
Paid = 'P'
}
Преобразуйте Enum в char:
PayCode enumPC = PayCode.NotPaid;
char charPC = (char)enumPC; // charPC == 'N'
Преобразуйте char в Enum:
char charPC = 'P';
if (Enum.IsDefined(typeof(PayCode), (int)charPC)) { // check if charPC is a valid value
PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid
}
Работает как шарм, как и следовало ожидать от типа char!
Ответ 3
Это обходной путь, который я использую
enum MyEnum
{
AA = 'A',
BB = 'B',
CC = 'C'
};
static void Main(string[] args)
{
MyEnum e = MyEnum.AA;
char value = (char)e.GetHashCode(); //value = 'A'
}
Ответ 4
Технически вы не можете этого сделать. Но вы можете преобразовать перечисление в байт, а затем преобразовать его в char. Это полезно, если ваша цель - иметь что-то подобное (осознание этого невозможно:
public enum CharEnum
{
one = '1'
}
Вы можете сделать это, однако, используя значения байтов ASCII и затем преобразовать:
public enum CharEnum
{
one = 49,
two = 50
}
Затем вы можете преобразовать в байт и char, чтобы получить значение char. Это не очень красиво, но он будет работать, если получение char - ваша конечная цель. Вы также можете использовать unicode и значение int, если вам нужны символы вне диапазона ASCII.: -)
Ответ 5
char charPC = 'P';
if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) {
// check if charPC is a valid value
PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid
}
- Сделано небольшое изменение, нет необходимости преобразовывать его в (if int) в if для всех случаев, зависит от типа перечисления. Но если вы нажмете его непосредственно на тип перечисления, он всегда должен работать.
Ответ 6
Довольно многое уже было сказано об этом. Просто хотел сказать, что вы можете использовать расширения, если используете много "char перечислений":
public enum MyEnum
{
MY_VALUE = 'm'
}
public static class MyExtensions
{
public static char GetChar(this Enum value)
{
return (char)value.GetHashCode();
}
}
class Program
{
public static void Main(string[] args)
{
MyEnum me = MyEnum.MY_VALUE;
Console.WriteLine(me + " = " + me.GetChar());
}
}
Ответ 7
Перечисления символов будут просто строками, не так ли? Я не уверен, какую другую выгоду вы извлекли бы из перечисления символов?
Как говорили другие, тип по умолчанию - int для перечисления.