привести к работам возврата только для IEnumerable <T>?

Стандарт должен бросить NullPointerException. Вообще безошибочный "Эффективный Java" обсуждает это кратко в Объекте 42 (первый выпуск), Объект 60 (второй выпуск), или Объект 72 (третий выпуск) "Способствует использованию стандартных исключений":

"Возможно, все ошибочные вызовы метода сводятся к недопустимому аргументу или недопустимому состоянию, но другие исключения стандартно используются для определенных видов недопустимых аргументов и состояний. Если вызывающая сторона передает пустой указатель в некотором параметре, для которого запрещаются нулевые значения, соглашение диктует, что NullPointerException брошены, а не IllegalArgumentException".

31
задан shekhar 2 October 2015 в 07:27
поделиться

7 ответов

yield return works for exactly 4 cases:

  • IEnumerable
  • IEnumerable
  • IEnumerator
  • IEnumerator

This is because it has to build a state machine internally; a dictionary (etc) wouldn't be possible with this. You can of course just return a suitable type instead.

46
ответ дан 27 November 2019 в 21:53
поделиться

Однако вы можете вернуть IEnumerable > , что будет похоже на словарь. Затем вы вернете KeyValuePairs. Вы даже можете обернуть это другим методом, который создает словарь из возврата. Единственное, чего не может гарантировать первый метод, - это уникальность ключей.

17
ответ дан 27 November 2019 в 21:53
поделиться

Ответ: Нет. Оператор yield return может использоваться только в том случае, если return тип - IEnumerator , IEnumerator , IEnumerable или IEnumerable

[...]

Из §10.14.5:

Перечислимый объект имеет следующие характеристики:

  1. Он реализует IEnumerable и IEnumerable , где T - тип доходности итератора.

[...]

5
ответ дан 27 November 2019 в 21:53
поделиться

Нет, потому что блок итератора - это просто конечный автомат, созданный компилятором от вашего имени. Эта функция позволяет вам «уступить» и элемент как часть последовательности.

Если тип возврата был отличным от IEnumerable (например, IDictionary ), компилятор должен был бы сгенерировать методы для реализации этого интерфейса, и на этом этапе это не имело бы особого смысла, потому что вы работали бы с коллекцией, а не с последовательностью.

2
ответ дан 27 November 2019 в 21:53
поделиться

Просто вызовите метод итератора и цепочку ToDictionary или GroupBy после него, и вы получите то же самое. Поместите это в однострочный метод-оболочку, если вам нужно вызвать его таким образом из нескольких мест.

2
ответ дан 27 November 2019 в 21:53
поделиться

Я так не думаю. Хотя в документации это точно не говорится, способ ее формулировки подразумевает, что ее можно использовать только тогда, когда типом возвращаемого значения метода является либо IEnumerable , либо IEnumerable. . Возможно, вы сможете написать класс, реализующий IGrouping с учетом IEnumerable (который будет возвращен из вашего метода с помощью yield return ), но это почти единственный вариант действительно.

1
ответ дан 27 November 2019 в 21:53
поделиться

nope, just ienumerable :-)

0
ответ дан 27 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: