Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

convert IList<Derived> to IReadOnlyCollection<Base>

Tags:

c#

collections

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)

like image 803
D.R. Avatar asked Oct 25 '25 15:10

D.R.


1 Answers

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>.

like image 88
MarcinJuraszek Avatar answered Oct 27 '25 03:10

MarcinJuraszek



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!