Скастовать IList в IReadOnlyList
Нужен экземпляр-обёртка IReadOnlyList. Но внезапно я не могу скастовать его с IList. Это напрямую значит, что у меня нет никакой возможности создать ReadOnly-коллекцию, не имя экземпляра непосредственно List, не так ли?
Ответы (1 шт):
Интерфейс используется для доступа к полям и свойствам класса. Интерфейс как объект создать невозможно, но можно к нему привести экземпляр класса, который его реализует.
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;
}
В данном варианте сам список доступен для изменения только внутри текущего класса, а наружу отдается он в виде интерфейса, который позволяет его только читать.