[C#] Perché non possiamo avere tipi di enumerazione "char"


Answers

Il tipo predefinito è int. Ulteriori informazioni al riferimento C # a MSDN. È inoltre possibile trovare un collegamento alle specifiche del linguaggio C # su MSDN. Penso che la ragione della restrizione derivi probabilmente da queste affermazioni nelle specifiche del linguaggio, sezione 4.1.5.

Il tipo di carattere è classificato come un tipo integrale, ma si differenzia dagli altri tipi di integrale in due modi:

• Non ci sono conversioni implicite da altri tipi al tipo di carattere. In particolare, anche se i tipi sbyte, byte e ushort hanno intervalli di valori che sono completamente rappresentabili usando il tipo char, le conversioni implicite da sbyte, byte o ushort a char non esistono.

• Le costanti del tipo di carattere devono essere scritte come caratteri letterali o come valori interi-letterali in combinazione con un cast per digitare char. Ad esempio, (char) 10 è uguale a '\ x000A'.

Question

Voglio sapere perché non possiamo avere "char" come tipo di enum sottostante. Come abbiamo byte, sbyte, int, uint, long, ulong, short, ushort come tipo enum sottostante. Secondo quale è il tipo di base predefinito di un enum?




Tecnicamente, non puoi farlo. Ma puoi convertire l'enum in un byte e poi convertirlo in char. Questo è utile se il tuo obiettivo è avere qualcosa di simile (rendendosi conto che è impossibile farlo:

public enum CharEnum
{
    one = '1'
}

È possibile farlo, tuttavia, utilizzando i valori di byte ASCII e quindi la conversione:

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

È quindi possibile convertire in byte e in char per ottenere il valore char. Non è molto bello, ma funzionerà, se ottenere un char è il tuo obiettivo finale. Puoi anche usare unicode e un valore int, se hai bisogno di caratteri al di fuori dell'intervallo ASCII. :-)




Le enumerazioni di carattere sarebbero semplicemente stringhe, no? Non sono sicuro di quale altro vantaggio deriverebbe dall'enumerazione di un personaggio?

Come altri hanno già detto, il tipo predefinito è int per un'enumerazione.




Praticamente tutto è già stato detto a riguardo. Volevo solo dire che puoi usare le estensioni se usi un sacco di "enanti":

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());
    }
}



So che questa è una domanda più vecchia, ma questa informazione mi sarebbe stata utile:

Sembra che non ci siano problemi nell'utilizzare char come tipo di valore per enum in C # .NET 4.0 (forse anche 3.5, ma non l'ho provato). Ecco cosa ho fatto e funziona completamente:

public enum PayCode {
    NotPaid = 'N',
    Paid = 'P'
}

Converti Enum in char:

PayCode enumPC = PayCode.NotPaid;
char charPC = (char)enumPC; // charPC == 'N'

Converti char in 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
}

Funziona come un incantesimo, proprio come ti aspetteresti dal tipo char!




char charPC = 'P';
if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) { 
        // check if charPC is a valid value
        PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid
}
  • Fatto un piccolo cambiamento, non c'è bisogno di convertirlo in un ( int ) nel caso, per tutti i casi, dipende dal tipo di enum. Ma se lo lanci direttamente al tipo enum stesso, dovrebbe sempre funzionare.



Questo è un rimedio che sto usando

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

static void Main(string[] args)
{
    MyEnum e = MyEnum.AA;
    char value = (char)e.GetHashCode(); //value = 'A'
}