That's true. One advantage of this approach is that it let's you return interfaces so long as you return cacheable implementations of those interfaces. For example, you could have a cached function that returns IReadOnlyList<int> (which may or may not be cacheable), and have it work so long as you return a custom list implementation that IS cacheable (e. g. CacheableList<T> in Apt.Core)