Ответ 1
Использование базовых типов параметров имеет следующие преимущества:
- Уменьшает ненужную связь в коде
- Делает ваш код более гибким, позволяя более широкий диапазон допустимых входов
- Обеспечивает безопасность вашего кода, ограничивая типы операций, которые могут выполняться на входе
- Повышает производительность вашего кода за счет уменьшения необходимости выполнять преобразования между типами
Однако вы не всегда должны использовать базовый тип в вызове метода только потому, что такой инструмент, как ReSharper, говорит, что это возможно. Вы должны убедиться, что использование и семантика методов ясны - и что будущие изменения вряд ли потребуют перемещения по иерархии наследования - потенциально нарушение существующего кода.
В приведенных выше примерах использование IEnumerable вместо списка позволяет вызывающим вашим кодом передавать не только объекты List, но также массивы, стеки, очереди и даже результаты вызовов LINQ (которые в первую очередь возвращают IEnumerable). Поскольку ваш код выполняет только итерацию по коллекции, ему не нужно знать о List. Это также означает, что потребителям вашего кода не придется конвертировать свои коллекции в копии типа List, чтобы передать их вашему методу.