Quiero saber por qué no podemos tener "char" como tipo de enumeración subyacente. Como tenemos byte, sbyte, int, uint, long, ulong, short, ushort como subyacente tipo enum. Segundo, ¿cuál es el tipo subyacente predeterminado de una enumeración?Por qué no podemos tener "enum" enum tipo
Respuesta
El tipo predeterminado es int. Más información en C# reference en MSDN. También puede encontrar un enlace al C# language specification en MSDN. Creo que la razón de la restricción probablemente se deriva de estas declaraciones en la especificación del lenguaje, sección 4.1.5.
El tipo char se clasifica como un tipo integral , pero se diferencia de los otros tipos integrales de dos maneras:
• No hay conversiones implícitas de otros tipos al tipo char. En particular, incluso aunque el sbyte, byte, y los tipos USHORT tienen rangos de valores que son completamente representable utilizando el tipo char, implícitas conversiones de sbyte, byte, o ushort a CHAR no existe.
• Constantes del tipo char debe escribe como caracteres literales o como enteros literales, en combinación con un elenco de tipo char. Por ejemplo, (char) 10 es lo mismo que '\ x000A'.
Enumeradores de caracteres simplemente serían cadenas ¿no? No estoy seguro de qué otro beneficio obtendrías de una enumeración de caracteres?
Como han dicho otros, el tipo predeterminado es int para una enumeración.
Técnicamente, no puedes hacer esto. Pero, puedes convertir la enumeración en un byte y luego convertir eso en char. Esto es útil si su objetivo es tener algo como esto (darse cuenta de que esto es imposible de hacer:
public enum CharEnum
{
one = '1'
}
Usted puede hacer esto, sin embargo, mediante el uso de valores de bytes ASCII y luego convertir:
public enum CharEnum
{
one = 49,
two = 50
}
A continuación, puede convertir a byte y a char para obtener el valor de char. No es realmente bonito, pero funcionará, si obtener un char es su objetivo final. También puede usar unicode y un valor int, si necesita caracteres externos del rango ASCII. :-)
Esto es una solución Estoy 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'
}
O simplemente podría escribir '(char) e' sin el' GetHashCode() '. –
Todo lo que necesitas es '(char) e'. [Estás incurriendo en una penalización de boxeo yendo por 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) – nawfal
Sé que esto es una cuestión mayor, pero esta información habría sido útil para mí:
Parece que no hay ningún problema usando char como tipo de valor para las enumeraciones en C# .NET 4.0 (posiblemente incluso 3.5, pero no he probado esto).Esto es lo que he hecho, y funciona por completo:
public enum PayCode {
NotPaid = 'N',
Paid = 'P'
}
Convertir Enum a char:
PayCode enumPC = PayCode.NotPaid;
char charPC = (char)enumPC; // charPC == 'N'
carbón Convertir 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
}
funciona de maravilla, al igual que lo esperarías del tipo de char!
has votado tu respuesta, pero ten en cuenta que la enumeración en respuesta todavía tiene 'int' como el tipo subyacente. El compilador lo trata como 'int'. Wished C# no tenía este caso extremo. – nawfal
Casi todo se ha dicho ya sobre eso. Sólo quería decir que puede utilizar extensiones si se utiliza una gran cantidad de "enumeraciones 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());
}
}
Todo lo que necesitas es '(char) e'. [Estás incurriendo en penalización de boxeo yendo por 'enum.GetHashCode'.] (Http://stackoverflow.com/questions/7995606/boxing-occurrence-in-c-sharp) Además,' GetHashCode' es simplemente un detalle de implementación . – 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
}
- hizo un pequeño cambio, no hay necesidad de convertirlo en un (int) en el si para todos los casos, depende del tipo enum. Pero si lo lanzas directamente al tipo enum, debería funcionar siempre.
- 1. ¿Por qué no podemos acceder a los valores enum desde una instancia enum en C#?
- 2. ¿Por qué se usa typedef con el tipo enum?
- 3. lista Postgres ENUM tipo
- 4. java enum tipo instanciation
- 5. ¿Por qué necesitamos conversión de tipo enum en C#
- 6. enum valueOf IllegalArgumentException: No enum const class
- 7. ¿Por qué ENUM es mejor que INT
- 8. Enum vs Enum fuertemente tipada
- 9. ¿Por qué la declaración enum acepta breve pero no Int16
- 10. .NET Tipo de base Enum de Char
- 11. Convertir en Enum subyacente tipo
- 12. anulable Enum tipo anulable pregunta
- 13. ¿Enum enum en JNI?
- 14. ¿Para qué sirve Enum?
- 15. ¿Por qué C# permitiría un valor de enum no válido?
- 16. ¿Por qué Phobos usa enum para constantes?
- 17. typedef struct y enum, ¿por qué?
- 18. Valores enum no únicos
- 19. enum anidado, ¿por qué se usa?
- 20. ¿Por qué una enum de Java no puede ser definitiva?
- 21. En Java, ¿por qué es posible calificar una Constante Enum con otra Constante Enum?
- 22. ¿Está vacío enum (enum {};) portátil?
- 23. Devuelve el valor de Enum predeterminado cuando no se conoce el tipo Enum
- 24. C++ typedef enum y justo ENUM
- 25. Asignación de valores xml a enum tipo
- 26. verificación de tipo enum en C/gcc
- 27. C#: ¿Por qué no podemos tener métodos internos/funciones locales?
- 28. ¿Podemos tener funciones virtuales estáticas? Si no, ¿POR QUÉ?
- 29. ¿Por qué no puedo asignar el elemento enum incorrecto, pero puedo compararlo con el elemento enum incorrecto?
- 30. ¿Cómo comento un tipo público visible Enum?
Es útil al convertir desde una columna de base de datos que es un NCHAR (0001) y la enumeración. Específicamente, es útil tener algo que tenga sentido cuando se lo mire en una selección, pero se limita a un conjunto específico de valores. Como un ejemplo: estado. Pendiente: 'P', En curso: 'I', Completado con éxito: 'S', Fallido: 'F'. –
Apoyo el comentario de la base de datos ya que eso es exactamente lo que me llevó a esta pregunta. – Nathan