Скастовать IList в IReadOnlyList

Нужен экземпляр-обёртка IReadOnlyList. Но внезапно я не могу скастовать его с IList. Это напрямую значит, что у меня нет никакой возможности создать ReadOnly-коллекцию, не имя экземпляра непосредственно List, не так ли?


Ответы (1 шт):

Автор решения: aepot

Интерфейс используется для доступа к полям и свойствам класса. Интерфейс как объект создать невозможно, но можно к нему привести экземпляр класса, который его реализует.

List<string> list = new List<string>() { "привет" };
IReadOnlyList<T> readOnlyList = (IReadOnlyList<T>)list; // апкаст
Console.WriteLine(readOnlyList[0]); // привет
readOnlyList[0] = "мир"; // ошибка компиляции
readOnlyList.Add("мир"); // ошибка компиляции

Это напрямую значит, что у меня нет никакой возможности создать ReadOnly-коллекцию, не имя экземпляра непосредственно List, не так ли?

Верно.

По поводу реализации полей и свойств:

private List<string> _list;

public IReadOnlyList<string> List
{
    get => _list;
}

В данном варианте сам список доступен для изменения только внутри текущего класса, а наружу отдается он в виде интерфейса, который позволяет его только читать.

→ Ссылка