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
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".
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.
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 :-)
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'
}
Oppure potresti scrivere '(char) e' senza' GetHashCode() '. –
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
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!
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
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());
}
}
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
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.
- 1. C#: Perché non possiamo avere metodi interni/funzioni locali?
- 2. Perché non possiamo accedere ai valori enum da un'istanza enum in C#?
- 3. C++ enum from char
- 4. Perché i tipi generici non possono avere un layout esplicito?
- 5. Perché non posso avere tipi di ritorno covarianti con void *?
- 6. Perché non posso static_cast tra char * e unsigned char *?
- 7. Possiamo avere una funzione virtuale statica? Se no, allora PERCHÉ?
- 8. Come non possiamo confrontare due valori enum con '<'?
- 9. tipi primitivi enum - esiste
- 10. Associare un char a un tipo enum
- 11. Possiamo avere popover nelle app Mac Cocoa?
- 12. Possiamo avere un metodo statico virtuale? (C++)
- 13. Possiamo definire enum all'interno di una funzione?
- 14. possiamo avere il testo non modificabile in EditText
- 15. Copertura Emma su tipi Enum
- 16. Julia: perché i tipi parametrici devono avere costruttori esterni?
- 17. Domanda intervista: possiamo avere un'eco prima dell'intestazione?
- 18. Errore C++: tipi incompatibili nell'assegnazione di 'char *' a 'char [2]
- 19. Perché questo metodo Java sembra avere due tipi di ritorno?
- 20. Perché non possiamo eseguire il ciclo su `...`?
- 21. Possiamo avere un incarico in una condizione?
- 22. Possiamo avere una matrice di moduli personalizzati?
- 23. Perché è permesso "enum of enum of enum..`?
- 24. Perché sizeof (char + char) restituisce 4?
- 25. Come testare i tipi di enum?
- 26. Perché è possibile assegnare un const char * a un char *?
- 27. Perché non può convertire TCHAR * a char *
- 28. Riutilizzo dei valori enum in tipi di enum separati
- 29. Perché non possiamo usare le stringhe C come SEL?
- 30. ENUM e tipi creazione in SQLite
È 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". –
I secondo il commento del database in quanto è esattamente ciò che mi porta a questa domanda. – Nathan