Em C #, é possível decorar um tipo de Enum com um atributo ou fazer outra coisa para especificar qual deve ser o valor padrão, sem que os valores sejam alterados? Os números necessários podem ser definidos por qualquer motivo, e seria útil ainda ter controle sobre o padrão.
enum Orientation
{
None = -1,
North = 0,
East = 1,
South = 2,
West = 3
}
Orientation o; // Is 'North' by default.
int
s no resumo , simplesmente porque elas são implementadas como tipos numéricos. Poderíamos implementar enums como strings, e isso não mudaria sua utilidade. Considero a resposta aqui uma limitação da expressividade da linguagem C #; a limitação certamente não é inerente à idéia de "distinguir valores de um conjunto restrito".enum
s como construções em nível de tipo, especificamente como tipos de soma (ou veja aqui . Ou seja, considere cada enum como um tipo distinto, em que todos os valores desse tipo são distintos dos demais valores de enum. De acordo com essa mentalidade, é impossível que as enumeras compartilhem qualquer valor e, de fato, essa abstração se desintegra quando você considera que o padrão de0
pode ou não ser válido para uma determinada enumeração e é simplesmente excitado em cada enumeração.Respostas:
O padrão para um
enum
(de fato, qualquer tipo de valor) é 0 - mesmo que esse valor não seja válidoenum
. Não pode ser alterado.fonte
O valor padrão de qualquer enumeração é zero. Portanto, se você deseja definir um enumerador como o valor padrão, defina esse como zero e todos os outros enumeradores como diferente de zero (o primeiro enumerador a ter o valor zero será o valor padrão para essa enumeração, se houver vários enumeradores com o valor zero).
Se seus enumeradores não precisarem de valores explícitos, verifique se o primeiro enumerador é o que você deseja que seja o enumerador padrão, pois "Por padrão, o primeiro enumerador tem o valor 0 e o valor de cada enumerador sucessivo é aumentado por 1. " ( Referência C # )
fonte
Se zero não funcionar como o valor padrão adequado, você poderá usar o modelo de componente para definir uma solução alternativa para a enumeração:
e então você pode ligar para:
Nota: você precisará incluir a seguinte linha na parte superior do arquivo:
Isso não altera o valor padrão do enum, mas fornece uma maneira de indicar (e obter) o valor padrão desejado.
fonte
else
instrução da seguinte forma:return default(TEnum);
. Primeiro, ele reduzirá asEnum.GetValues(...).***
chamadas mais lentas , depois (e mais importante) será genérico para qualquer tipo, mesmo que não seja enum. Além disso, você não restringe o código a ser usado apenas para enumerações; portanto, isso corrige possíveis exceções quando usado em tipos não enumeráveis.O padrão de uma enumeração é qualquer enumeração igual a zero. Não acredito que isso possa ser alterado por atributo ou por outros meios.
(MSDN diz: "O valor padrão de uma enumeração E é o valor produzido pela expressão (E) 0.")
fonte
Você não pode, mas se quiser, pode fazer algum truque. :)
uso dessa estrutura como enum simples.
onde você pode criar pa == Orientation.East (ou qualquer valor que você deseja) por padrão
para usar o truque em si, é necessário converter de int por código.
aí a implementação:
fonte
value + 1
; caso contrário, agora seusdefault(Orientation)
retornosEast
. Além disso, torne o construtor privado. Boa abordagem.Mais uma maneira que pode ser útil - usar algum tipo de "apelido". Por exemplo:
fonte
Status s = default(Status);
não será um dos membros do status, poiss
terá o valor de(Staus) 0
. O último é válido para escrever diretamente, pois as enumerações podem ser convertidas em números inteiros, mas falharão durante a desserialização, pois a estrutura garante que uma enumeração seja sempre desserializada para um membro válido. Seu código será perfeitamente válido se você alterar a linhaNew = 10
paraNew = 0
.Na verdade
enum
, o padrão de um é o primeiro elemento emenum
cujo valor é0
.Então, por exemplo:
fonte
Console.WriteLine(Animals.Pony);
imprime "Cat")The default value of enum is the enummember equal to 0 or the first element(if value is not specified)
... Mas enfrentei problemas críticos usando enum em meus projetos e superei fazendo algo abaixo ... Como sempre minha necessidade estava relacionada ao nível de classe ...e obtenha o resultado esperado
Agora, e se o valor vier do DB .... Ok, neste cenário ... passe o valor na função abaixo e ele converterá o valor em enum ... a função abaixo manipulou vários cenários e é genérica ... e acredite em mim muito rápido ..... :)
fonte
O valor padrão para um tipo de enumeração é 0:
" Por padrão, o primeiro enumerador tem o valor 0 e o valor de cada enumerador sucessivo é aumentado em 1. "
" O tipo de valor enum tem o valor produzido pela expressão (E) 0, onde E é o identificador de enum. "
Você pode verificar a documentação para o C # enum aqui e a documentação para a tabela de valores padrão do C # aqui .
fonte
Se você definir a enumeração padrão como a enumeração com o menor valor, poderá usar isso:
Isso não pressupõe que o enum tenha um valor zero.
fonte
O padrão é o primeiro na definição. Por exemplo:
Isso retornará
His
fonte
Se você definir a propriedade como null, retornará Orientations.None em get. A propriedade _orientation é nula por padrão.
fonte
Então no código você pode usar
fonte