Из MSDN:
Устраняя ненужные приведения, неявные преобразования могут улучшить читаемость исходного кода. Однако, поскольку неявные преобразования могут происходить без указания их программистом, необходимо соблюдать осторожность, чтобы предотвратить неприятные сюрпризы. В общем, операторы неявного преобразования никогда не должны генерировать исключения и никогда не терять информацию, чтобы их можно было безопасно использовать без ведома программиста. Если оператор преобразования не может соответствовать этим критериям, он должен быть помечен как явный.
Хотя я не возражаю ни по одному конкретному пункту и согласен с тем, что все это очень хорошо, есть ли когда-нибудь причина, достаточно веская, чтобы оправдать нарушение части о неявных преобразованиях, а не об исключении?
Конкретный случай, который у меня есть передо мной, это тот, где:
- У меня есть функция, которая возвращает пользовательский объект коллекции (назовем его
FooCollection). - Эта функция может возвращать коллекции с одним элементом, и из исходного кода можно определить, произойдет это или нет. (под этим я подразумеваю только вызов функции, а не саму функцию)
- Если это произойдет, то с вероятностью 99,9 % пользователю нужен этот единственный элемент, а не коллекция с одним элементом.
Теперь я думаю, не включить ли неявное преобразование из FooCollection => Foo, чтобы скрыть эту маленькую деталь реализации, но это преобразование будет работать только в том случае, если в коллекции есть один элемент.
Можно ли выбросить Exception в этом случае? Или вместо этого я должен использовать явное приведение? Любые другие идеи о том, как я мог бы справиться с этим (нет, из-за деталей реализации я не могу просто использовать две функции)?
EDIT: я считаю достойным отметить, что FooCollection не реализует никаких интерфейсов и фактически не расширяет Collection, как может подразумевать название, поэтому ответы на основе LINQ бесполезны. Кроме того, хотя в коллекции реализован числовой индекс, это не самый интуитивный способ работы с коллекцией, поскольку он в основном опирается на именованный индекс.