Вы можете взглянуть на этот аргумент с нескольких точек зрения, в том числе с точки зрения чисто ОО-подхода, в котором говорится, что программирование против интерфейса не является реализацией. С этой мыслью использование IList следует тому же принципу, что и обход и использование интерфейсов, которые вы определяете с нуля. Я также верю в факторы масштабируемости и гибкости, предоставляемые интерфейсом в целом. Если класс, реализующий IList , необходимо расширить или изменить, код потребления не должен изменяться; он знает, чего придерживается контракт IList Interface. Однако использование конкретной реализации и List для изменяющегося класса может также привести к необходимости изменения вызывающего кода. Это связано с тем, что класс, придерживающийся IList , гарантирует определенное поведение, которое не гарантируется конкретным типом, использующим List .
Также имея возможность делать что-то вроде изменения стандартной реализации List в классе реализующий IList , например, .Add, .Remove или любой другой метод IList дает разработчику lot гибкости и мощи, иначе предопределено List