Ответ Marxidad хорош (обратите внимание, что Вам только нужно Next(0,values.Length)
, так как верхняя граница эксклюзивна) - но не упустите синхронизацию. Если Вы сделаете это в жестком цикле, Вы получите много повторений. Для создания его более случайным рассмотрите хранение Случайного объекта в поле - т.е.
private Random rand = new Random();
public T RandomEnum<T>()
{
T[] values = (T[]) Enum.GetValues(typeof(T));
return values[rand.Next(0,values.Length)];
}
, Если это будет статическое поле, необходимо будет синхронизировать доступ.
Я почти уверен, что нашел причину этого, и это не короткое появление компилятора VB, а короткое появление компилятора C #.
Рассмотрим следующее, которое допустимо в VB:
Dim foo = Function() String.Empty
Эквивалент не будет допустимым в c #:
var foo = () => string.Empty;
Итак, вывод типа немного сильнее в VB, из-за этого аргумент в примере Function() String.Empty
может быть выведен в Function(Of String)
, что применимо к перегрузке Foo(Of T)(ByVal value As T)
.
В C # этого не может быть, поскольку () => string.Empty
никогда не может быть выведено без контекста, оно может быть выведено в перегрузке выражения, но не в T-перегрузке.