2009-02-21 16 views
40

Voglio sapere perché non possiamo avere "char" come tipo enum sottostante. Come abbiamo byte, sbyte, int, uint, long, ulong, short, ushort come tipo di enumerazione sottostante. In secondo luogo qual è il tipo di base predefinito di un enum?Perché non possiamo avere tipi enum "char"

risposta

15

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

Il tipo char è classificato come un tipo intero , ma differisce dagli altri tipi integrali in due modi:

• ci sono conversioni implicite da altri tipi al tipo char. In particolare, anche se lo sbyte, byte, e tipi USHORT hanno intervalli di valori che sono completamente rappresentabile utilizzando il tipo char, impliciti conversioni da sbyte, byte, o ushort a char non esistono.

• Costanti di tipo char deve essere scritto come caratteri-letterali o come interi-letterali in combinazione con un getto a char. Ad esempio, (char) 10 è uguale a "\ x000A".

-4

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.

+2

È utile quando si converte da una colonna di database che è un NCHAR (0001) e l'enum. Nello specifico, è utile avere qualcosa che abbia senso quando lo si guarda in una selezione, ma è limitato a un insieme specifico di valori. Ad esempio: stato. In sospeso: "P", In corso: "I", completato correttamente: "S", non riuscito: "F". –

+0

I secondo il commento del database in quanto è esattamente ciò che mi porta a questa domanda. – Nathan

3

Tecnicamente, non è possibile farlo. Ma puoi convertire l'enum in un byte e poi convertirlo in char. Questo è utile se il tuo obiettivo è quello di avere qualcosa di simile (realizzando questo è impossibile da fare:

public enum CharEnum 
{ 
    one = '1' 
} 

Si può fare questo, però, utilizzando i valori ASCII byte e poi 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 all'esterno della gamma ASCII :-)

13

Questa soluzione è 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' 
} 
+5

Oppure potresti scrivere '(char) e' senza' GetHashCode() '. –

+4

Tutto ciò che serve è '(char) e'. [Stai incorrendo nella pena di boxe andando per 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) – nawfal

76

So che questa è una domanda più vecchio, ma questa informazione sarebbe stato utile per me:

Sembra che non v'è alcun problema utilizzando char come il tipo di valore per le enumerazioni in C# .NET 4.0 (forse anche 3.5, ma non l'ho provato).Ecco quello che ho fatto, e funziona tutto:

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

Converti Enum a char:

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

Converti char a 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 fascino, proprio come ti aspetteresti dal tipo char!

+8

ha messo in su la tua risposta, ma sii consapevole dell'enumerazione in risposta ha ancora 'int' come tipo sottostante. Il compilatore lo considera come 'int'. Il C# desiderato non ha avuto questo caso limite. – nawfal

-1

Praticamente tutto è già stato detto a riguardo. Volevo solo dire è possibile utilizzare le estensioni se si utilizza un sacco di "enumerazioni 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()); 
    } 
} 
+1

Tutto ciò che serve è '(char) e'. [Stai incorrendo nella penalità di boxe andando per 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) Inoltre,' GetHashCode' è semplicemente un dettaglio di implementazione . – nawfal

0
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) nella se per tutti i casi, dipende dal tipo di enum. Ma se lo lanci direttamente al tipo enum stesso, dovrebbe sempre funzionare.
Problemi correlati