Qual é o caso de uso para especificar o tipo subjacente em enums?

Qual é o ponto de ter

enum SomeEnum : byte // <---- { SomeValue = 0x01, ... } 

quando você tem que fazer um casting apenas para atribuí-lo ao mesmo tipo de variável que o tipo subjacente enums?

 byte b = (byte)SomeEnum.SomeValue; 

Na verdade, não faz muito sentido, exceto que se o tipo subjacente padrão ( int ) não for suficiente para você, ie. você quer usar valores inteiros mais altos do que isso, então você pode fazer isso por long . Isso pode ser útil quando você tem um enum [Flags] com mais de 32 valores.

Você pode torná-lo byte ou short apenas para restringir o intervalo de valores, mas na verdade ele ainda levará 4 bytes (ou seja, o mesmo que int ).

De enum (referência C #)

O tipo subjacente especifica quanto armazenamento é alocado para cada enumerador. No entanto, uma conversão explícita é necessária para converter do tipo enum para um tipo integral.

Além das razões técnicas porque … Existe um princípio de design aqui.

Especificar o enum como tendo armazenamento de bytes é um detalhe de implementação. Usar o enum é um problema diferente, você não deve precisar saber ou se importar com os detalhes da implementação dele.

No código do cliente, o fato de você estar usando um enum deve significar que você está, na verdade, usando um enum, não um byte ou longo etc. Caso contrário, por que não usar apenas o tipo de dados desejado.

Fortemente tipo languaged como C # se esforça para tornar um pouco mais difícil sair de seus “contratos” de codificação, o que geralmente ajuda a tornar o design do aplicativo um pouquinho melhor.

Agora, é claro que não estou dizendo que não há momentos em que você precisa se envolver em detalhes de implementação, um bom exemplo está em um mapeador relacional de object (ORM) em que você está mapeando um tipo de dados C # para um tipo de dados do database, enums bom exemplo onde você tem que saber o tipo de armazenamento para mapeá-lo. Mas nesses casos, o IMO é bom ter que lançar explicitamente ou refletir, é uma boa bandeira nas avaliações que aqui você está especificamente saindo do uso usual.