Son un tipo de dato especial que se utiliza para asignar nombres, strings, valores, a constantes y demás para hacer que el programa sea más fácil de leer y mantener a posteriori.
Básicamente un conjunto de constantes AGRUPADAS.
enum colors {red, blue, white, black, yellow, purple, brown, orange};
Cualquier derivado, deriva de System.enum
Se utiliza para números, no para strings, no se puede utilizar para strings
Y dar a ciertas constantes un significado global.
Se pueden dar los valores al principio, por ejemplo
enum colors {red = 5, blue, white, black, yellow, purple, brown, orange};
//En este código podemos apreciar como 5 es rojo, y va a ir aumentando en el resto de constantes, es decir, blue == 6, black == 7, etc
enum colors {red, blue, white, black, yellow = 7, purple, brown, orange};
//Este es otro caso curioso, donde red == 0, blue == 1 y así hasta llegar a yellow, a partir de ahí va purple == 8 y siguiendo.

enum colors = enum colors {red, blue, white, black, yellow, purple, brown, orange}
string namevalue = Enum.GetName(typeof(colores), 4);
// == black porque sería el nro 4