Я не уверен насчет c #, но другие языки допускают пробелы в значениях перечисления. Для учета этого:
enum A {b=0,c=2,d=3,e=42};
switch(rand.Next(0,4))
{
case 0: return A.b;
case 1: return A.c;
case 2: return A.d;
case 3: return A.e;
}
Основным недостатком является поддержание его в актуальном состоянии!
Не так аккуратно, но правильнее в этом угловом случае.
Как уже указывалось, приведенные выше примеры индексируют в массив допустимых значений, и это правильно. OTOH некоторые языки ( кашель D кашель ) не предоставляют этот массив, поэтому приведенное выше достаточно полезно, и я все равно его оставлю.