convert IList<Derived> to IReadOnlyCollection<Base>

c#, collections

Solution

Use `List<T>.AsReadOnly()` method:

public IReadOnlyCollection<BaseClass> BaseClasses
{
    get { return _elements.Cast<BaseClass>().ToList().AsReadOnly(); }
}

Or since `IReadOnlyCollection<T>` is covariant you can skip `Cast<BaseClass>`:

public IReadOnlyCollection<BaseClass> BaseClasses
{
    get { return _elements.ToList().AsReadOnly(); }
}

You could even skip `ToList()` if your field was `List<T>`, not `IList<T>`.

Problem

I have a private field `IList<DerivedClass> _elements` and want to create a property returning `IReadOnlyCollection<BaseClass>`. ``` public IReadOnlyCollection<BaseClass> BaseClasses { get { return _elements; } // compile time error } ``` How to do that without running into compile errors? (afaik this should work, as the `T` in `IReadOnlyCollection<T>` is covariant)

Original source