ВВ> Что это дает-то в принципе? На первый взгляд кажется, что это вообще скорее вредно.
в mainstream-языках это дает возможность статически проверять типы при возвращении интерфейса
если интерфейсы отнаследованы друг от друга
interface IEnumerable{ void Foo();}
interface ICollection:IEnumerable{void Bar();}
то функция возвращая ICollection, предоставит статически проверяемую возможность обратиться как к методам ICollection, так и к методам IEnumerable
ICollection GetItems(){..}
var items = GetItems();
items.Foo();
items.Bar();
если же интерфейсы независимы
interface IEnumerable{ void Foo();}
interface ICollection{void Bar();}
то функция сможет вернуть только или IEnumerable, или ICollection, и придется явно кастить, чтобы получить доступ к другому интерфейсу
ICollection GetItems(){..}
var items = GetItem();
((IEnumerable)items).Foo();
items.Bar();