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


Answers

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!

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. :-)




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