En C #, ¿es posible decorar un tipo Enum con un atributo o hacer otra cosa para especificar cuál debería ser el valor predeterminado, sin tener que cambiar los valores? Los números requeridos pueden establecerse en piedra por cualquier razón, y sería útil tener control sobre el valor predeterminado.
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
int
s en el resumen , simplemente porque se implementan como tipos numéricos. Podríamos implementar enumeraciones como cadenas, y no cambiaría su utilidad. Considero que la respuesta aquí es una limitación de la expresividad del lenguaje C #; la limitación ciertamente no es inherente a la idea de "distinguir valores de un conjunto restringido".enum
s como construcciones de nivel de tipo, específicamente como tipos de suma (o vea aquí . Es decir, considere cada enumeración como un tipo distinto, donde todos los valores de ese tipo son distintos de los valores de cualquier otra enumeración. Desde ese punto de vista, es imposible que las enumeraciones compartan algún valor, y de hecho, esta abstracción se desmorona cuando se considera que el valor predeterminado de0
puede o no ser válido para una enumeración dada, y simplemente se calza en cada enumeración.Respuestas:
El valor predeterminado para un
enum
(de hecho, cualquier tipo de valor) es 0, incluso si ese no es un valor válido para esoenum
. No se puede cambiar.fuente
El valor predeterminado de cualquier enumeración es cero. Entonces, si desea establecer un enumerador como valor predeterminado, establezca ese uno en cero y todos los demás enumeradores en no cero (el primer enumerador que tenga el valor cero será el valor predeterminado para esa enumeración si hay varios enumeradores con el valor cero).
Si sus enumeradores no necesitan valores explícitos, simplemente asegúrese de que el primer enumerador sea el que desea que sea el enumerador predeterminado, ya que "Por defecto, el primer enumerador tiene el valor 0, y el valor de cada enumerador sucesivo aumenta en 1. " ( Referencia de C # )
fuente
Si cero no funciona como el valor predeterminado adecuado, puede usar el modelo de componente para definir una solución alternativa para la enumeración:
y luego puedes llamar:
Nota: deberá incluir la siguiente línea en la parte superior del archivo:
Esto no cambia el valor predeterminado real del lenguaje C # de la enumeración, pero proporciona una forma de indicar (y obtener) el valor predeterminado deseado.
fuente
else
declaración de la siguiente manera:return default(TEnum);
. Puño, reducirá lasEnum.GetValues(...).***
llamadas más lentas , segundo (y más importante) será genérico para cualquier tipo, incluso sin enumeraciones. Además, no restringe el código para que se use solo para enumeraciones, por lo que esto realmente solucionará posibles excepciones cuando se use sobre tipos que no sean enum.El valor predeterminado de una enumeración es cualquier enumeración equivalente a cero. No creo que esto se pueda cambiar por atributo u otros medios.
(MSDN dice: "El valor predeterminado de una enumeración E es el valor producido por la expresión (E) 0").
fuente
No puedes, pero si quieres, puedes hacer algún truco. :)
uso de esta estructura como enumeración simple.
donde puede crear pa == Orientation.East (o cualquier valor que desee) de forma predeterminada
para usar el truco en sí, debe convertir de int por código.
allí la implementación:
fuente
value + 1
, de lo contrario ahora susdefault(Orientation)
devolucionesEast
. Además, haga que el constructor sea privado. Buen enfoque.Una forma más que podría ser útil: utilizar algún tipo de "alias". Por ejemplo:
fuente
Status s = default(Status);
no será ninguno de los miembros de estado, yas
que tendrá el valor de(Staus) 0
. Este último es válido para escribir directamente, ya que las enumeraciones se pueden convertir a enteros, pero fallará durante la deserialización, ya que el marco se asegura de que una enumeración siempre se deserialice a un miembro válido. Su código será perfectamente válido si cambia la líneaNew = 10
aNew = 0
.En realidad
enum
, el valor predeterminado de an es el primer elemento enenum
cuyo valor es0
.Así por ejemplo:
fuente
Console.WriteLine(Animals.Pony);
imprime "Gato")The default value of enum is the enummember equal to 0 or the first element(if value is not specified)
... Pero me he enfrentado a problemas críticos al usar la enumeración en mis proyectos y los he superado al hacer algo a continuación ... Cómo siempre se relacionó mi necesidad con el nivel de la clase ...y obtener el resultado esperado
Ahora, ¿qué pasa si el valor proviene de DB ... Ok, en este escenario ... pase el valor en la función a continuación y convertirá el valor en enum ... la función a continuación manejó varios escenarios y es genérico ... muy rapido ..... :)
fuente
El valor predeterminado para un tipo de enumeración es 0:
" Por defecto, el primer enumerador tiene el valor 0, y el valor de cada enumerador sucesivo se incrementa en 1. "
" El tipo de valor enum tiene el valor producido por la expresión (E) 0, donde E es el identificador de enumeración " .
Puede consultar la documentación para la enumeración de C # aquí , y la documentación para la tabla de valores predeterminados de C # aquí .
fuente
Si define la enumeración predeterminada como la enumeración con el valor más pequeño, puede usar esto:
Esto no supone que la enumeración tenga un valor cero.
fuente
El valor predeterminado es el primero en la definición. Por ejemplo:
Esto volverá
His
fuente
Si establece la propiedad en nulo, devolverá Orientaciones. Ninguna en get. La propiedad _orientation es nula por defecto.
fuente
Luego en el código puedes usar
fuente