Почему у нас не может быть типов "char" - PullRequest
40 голосов
/ 21 февраля 2009

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

Ответы [ 8 ]

76 голосов
/ 18 апреля 2012

Я знаю, что это старый вопрос, но эта информация была бы полезна для меня:

Похоже, что нет проблем с использованием char в качестве типа значения для перечислений в C # .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!

15 голосов
/ 21 февраля 2009

Тип по умолчанию - int. Больше информации на C # ссылка на MSDN. Вы также можете найти ссылку на спецификацию языка C # на MSDN. Я думаю, что причина ограничения, вероятно, происходит от этих утверждений в спецификации языка, раздел 4.1.5.

Тип символа классифицируется как интегральный тип, но он отличается от другие целочисленные типы двумя способами:

• Нет явных преобразований из других типов в тип char. В в частности, хотя Sbyte, байт, и типы ushort имеют диапазоны значения, которые полностью представимы используя тип char, неявный преобразования из sbyte, byte или ushort to char не существует.

• Константы типа char должны быть написано как символьные литералы или как целочисленные литералы в сочетании с приведите к типу char. Например, (char) 10 совпадает с '\ x000A'.

13 голосов
/ 10 мая 2010

Это обходной путь, который я использую

enum MyEnum
{
    AA = 'A',
    BB = 'B',
    CC = 'C'
};

static void Main(string[] args)
{
    MyEnum e = MyEnum.AA;
    char value = (char)e.GetHashCode(); //value = 'A'
}
3 голосов
/ 21 февраля 2009

Технически, вы не можете этого сделать. Но вы можете преобразовать перечисление в байт, а затем преобразовать его в символ. Это полезно, если ваша цель - сделать что-то подобное (понимая, что это невозможно сделать:

public enum CharEnum
{
    one = '1'
}

Однако вы можете сделать это, используя байтовые значения ASCII и затем преобразовав:

public enum CharEnum
{
    one = 49,
    two = 50
}

Затем вы можете преобразовать в байты и в char, чтобы получить значение char. Это не очень красиво, но это сработает, если ваша цель - получить персонажа. Вы также можете использовать Unicode и значение int, если вам нужны символы вне диапазона ASCII. : -)

1 голос
/ 12 мая 2018

См. Стандарт ECMA 335, Common Language Infrastructure (CLI), в Ecma International . CLI позволяет базовому типу быть char или bool, но C # и VB.Net не позволяют этого. Для чего это стоит, C ++ / CLI разрешает System :: Char в качестве базового типа.

Я предполагаю, что C # и VB.Net не допускают использование char и bool в качестве базового типа только по синтаксическим причинам.

0 голосов
/ 25 сентября 2017
char charPC = 'P';
if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) { 
        // check if charPC is a valid value
        PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid
}
  • Сделано небольшое изменение, нет необходимости преобразовывать его в ( int ), если для всех случаев, зависит от типа перечисления. Но если вы приводите его непосредственно к типу enum, он всегда должен работать.
0 голосов
/ 27 октября 2012

Практически все уже сказано об этом. Просто хочу сказать, что вы можете использовать расширения, если вы используете много "перечислений":

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());
    }
}
0 голосов
/ 21 февраля 2009

Перечисления символов будут просто строками, не так ли? Я не уверен, какую еще выгоду вы бы получили от перечисления персонажей?

Как уже говорили другие, для перечисления типом по умолчанию является int.

...