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