Стандарт должен бросить NullPointerException
. Вообще безошибочный "Эффективный Java" обсуждает это кратко в Объекте 42 (первый выпуск), Объект 60 (второй выпуск), или Объект 72 (третий выпуск) "Способствует использованию стандартных исключений":
"Возможно, все ошибочные вызовы метода сводятся к недопустимому аргументу или недопустимому состоянию, но другие исключения стандартно используются для определенных видов недопустимых аргументов и состояний. Если вызывающая сторона передает пустой указатель в некотором параметре, для которого запрещаются нулевые значения, соглашение диктует, что NullPointerException брошены, а не IllegalArgumentException".
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.
Однако вы можете вернуть IEnumerable
, что будет похоже на словарь. Затем вы вернете KeyValuePairs. Вы даже можете обернуть это другим методом, который создает словарь из возврата. Единственное, чего не может гарантировать первый метод, - это уникальность ключей.
Ответ: Нет. Оператор [...] Из §10.14.5: Перечислимый объект имеет следующие характеристики: [...] yield return
может использоваться только в том случае, если return тип - IEnumerator
, IEnumerator
, IEnumerable
или IEnumerable
IEnumerable
и IEnumerable
, где T
- тип доходности итератора.
Нет, потому что блок итератора - это просто конечный автомат, созданный компилятором от вашего имени. Эта функция позволяет вам «уступить» и элемент как часть последовательности.
Если тип возврата был отличным от IEnumerable
(например, IDictionary
), компилятор должен был бы сгенерировать методы для реализации этого интерфейса, и на этом этапе это не имело бы особого смысла, потому что вы работали бы с коллекцией, а не с последовательностью.
Просто вызовите метод итератора и цепочку ToDictionary
или GroupBy
после него, и вы получите то же самое. Поместите это в однострочный метод-оболочку, если вам нужно вызвать его таким образом из нескольких мест.
Я так не думаю. Хотя в документации это точно не говорится, способ ее формулировки подразумевает, что ее можно использовать только тогда, когда типом возвращаемого значения метода является либо IEnumerable
, либо IEnumerable.
. Возможно, вы сможете написать класс, реализующий IGrouping
с учетом IEnumerable
(который будет возвращен из вашего метода с помощью yield return
), но это почти единственный вариант действительно.