En relación con las mejores prácticas:
Cuando usted no tiene una razón particular para hacer la enumeración de un byte de tipo, debe dejarlo como predeterminado.
Cada vez que utilice una enumeración en una instrucción switch debe tener una cláusula "predeterminada" para un valor enum no válido. Por lo tanto, no importa si está buscando 256-NumRealEnumValues o 2^32-NumRealEnumValues. Ambos tendrán una cláusula predeterminada que maneja todos los casos inválidos.
Una razón para establecer explícitamente el tipo de la enumeración, es si desea que su enumeración se corresponda con otro tipo en su programa y necesita emitir explícitamente entre ellos.
Cambiar el tipo al ajuste más pequeño no le ayudará tampoco con los problemas de versión. A menos que tenga exactamente el tamaño máximo de la enumeración completada. Al hacer una versión de los problemas me refiero a cuando tienes un dll compilado usando la enumeración, entonces agregas un nuevo valor enum, se puede ejecutar algún código que no estaba destinado a entrar en la cláusula "por defecto" de una instrucción switch.
relacionadas con la eficiencia:
No hay ningún beneficio en términos de eficiencia para que sea un byte.
int es más eficiente de usar porque la CPU en x86 tiene registros de 32 bits. La copia en un registro se hace 32 bits a la vez.
Cuando utiliza un tipo más pequeño, tiene que poner a cero parte del registro y copiar en el resto de los bits de orden inferior del registro.
Para que quede claro, yo estaba hablando de las mejores prácticas en lugar de optimización, aunque esta cuestión se presentó como una cuestión de optimización. Mi punto era realmente ya que se puede specifiy que, en caso de que "siempre" o en caso de que especifique o dejar que el compilador de decidir? – ghost