Подтвердить что ты не робот

Почему у нас не может быть типов "char"

Я хочу знать, почему мы не можем иметь char "в качестве основного типа перечисления. Поскольку у нас есть байт, sbyte, int, uint, long, ulong, short, ushort как основной перечислимый тип. Во-вторых, что является типом переименования по умолчанию?

4b9b3361

Ответ 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 для перечисления.