Это ошибка компилятора VB.NET или это ошибка дизайна?

Ответ 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)];
}

, Если это будет статическое поле, необходимо будет синхронизировать доступ.

17
задан Peter Mortensen 12 September 2015 в 08:09
поделиться

1 ответ

Я почти уверен, что нашел причину этого, и это не короткое появление компилятора 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-перегрузке.

2
ответ дан 30 November 2019 в 14:43
поделиться