Por que enums exigem um casting explícito para digitar int?

Não há perda de dados ao fazer isso, então qual é a razão para ter que converter explicitamente enums para ints?

Não seria mais intuitivo se fosse implícito, digamos, quando você tem um método de nível mais alto como:

PerformOperation ( OperationType.Silent type ) 

onde PerformOperation chama um método C ++ que é exposto como tal:

 _unmanaged_perform_operation ( int operation_type ) 

Existem dois usos principais e inconsistentes de enums:

 enum Medals { Gold, Silver, Bronze } [Flags] enum FilePermissionFlags { CanRead = 0x01, CanWrite = 0x02, CanDelete = 0x04 } 

No primeiro caso, não faz sentido tratar essas coisas como números. O fato de eles serem armazenados como inteiros é um detalhe de implementação. Você não pode adicionar, subtrair, multiplicar ou dividir logicamente Ouro, Prata e Bronze.

No segundo caso, também não faz sentido tratar essas coisas como números. Você não pode adicionar, subtrair, multiplicar ou dividi-los. As únicas operações sensatas são as operações bit a bit.

Enums são números ruins, então você não deve ser capaz de tratá-los como números acidentalmente.

Porque os enums não precisam ser baseados em int :

A palavra-chave enum é usada para declarar uma enumeração, um tipo distinto que consiste em um conjunto de constantes nomeadas, chamado de lista de enumeradores. Cada tipo de enumeração tem um tipo subjacente, que pode ser qualquer tipo integral, exceto char.

Então você pode fazer algo assim:

 enum Something :long { valueX = 0, valueY = 2147483648L } 

Por que você diz que não há perda de dados? Nem todos os enums são ints, afinal de contas. Eles devem ser typescripts com números inteiros, mas isso pode significar byte, ulong, etc.

Como um caso de canto, o literal 0 é implícito, mas; qual seria o seu caso de uso aqui?

É muito raro que eu precise fazer isso – geralmente importar dados etc. Um casting ocasional não funciona para mim e evita erros acidentais.

Não seria mais intuitivo se fosse implícito, digamos, quando você tem um método de nível mais alto como:

Eu realmente acho que não. Nesse caso, você está tentando usar um Enum em um caso extremo.

No entanto, se enums foram implicitamente convertidos em valores inteiros, isso reduziria drasticamente a sua eficácia. Forçando uma conversão int explicitamente, o compilador está tratando enum como um tipo especial – uma das muitas opções, não como um inteiro. Isso demonstra mais claramente a intenção do enum e reduz a chance de erros do programador (isto é, designar valores que não estão definidos no enum para uma variável enum etc.).

Pessoalmente, estou feliz que o enum em C # é mais (efetivamente) um valor int constante.

É assim que o C # funciona …

Se Enum tivesse herdado int, isso deveria ser possível. Enum não herda de int e, portanto, um casting é necessário.

A única maneira de implantar classs lançadas é se elas herdam.

Eu acho que a resposta para “Por que enums exigem um casting explícito para digitar int?” é que enums fortemente tipados como por C # são uma defesa útil contra erros comuns de programação.

Imagine que eu tivesse um aplicativo de gerenciamento de pintura, baseado em duas enums:

 enum Textures { Gloss, Satin, Matt }; enum Colors { White, Green, Red, Blue, Brown }; 

E um método de pintura de sala como este:

 private void PaintRoom (Textures texture, Colors color) 

Em uma linguagem com enum forte digitando como em c #, um comando como este:

  // nonsensical attempt to have texture=White and color=Matt PaintRoom(Colors.White, Textures.Matt); 

… seria um erro em tempo de compilation (não é possível colocar a cor onde uma textura é esperada e vice-versa). Mas em linguagens onde as enums não são fortemente tipadas e / ou a conversão implícita pode ocorrer (incluindo C e C ++), tanto nossas Colors quanto Textures podem ser tratadas como int , então podemos alegremente PaintRoom(Colors.White, Textures.Matt) um PaintRoom(Colors.White, Textures.Matt) comando e ele irá compilar bem, mas acabamos com uma sala pintada Gloss Red (0, 2) em vez do Matt White (2, 0) que pretendíamos eo código em uma rápida olhada parece dizer.

Enums tão fortemente tipados são, na maioria das vezes, uma coisa boa, para impedir que as pessoas acidentalmente coloquem enums em lugares para os quais não foram feitas. E onde alguém realmente quer seu enum como um int , o C # força o codificador a esclarecer sua intenção insistindo em uma conversão explícita.

Como outros já disseram, é impossível alterar o casting necessário de EnumType para int . No entanto, existem várias soluções alternativas. Por exemplo, eu tenho várias enums que se referem a coisas semelhantes e queria poder atribuir qualquer uma delas a uma variável. Então eu fui com:

 public ValueType State { get { return state; } set { state = (int)value; } } 

e assim, eu poderia dizer tanto playerObject.animator.State = Player.STANDING e monsterObject.animator.State = Monster.DROOLING , implicitamente na medida em que a class chamadora poderia dizer.

Além disso, sim, há uma razão legítima para que eu tenha que tratar os valores de enumeração como números.