Метод расширения IList <T>.AsReadOnly Не работает для коллекции ссылочных типов - PullRequest
4 голосов
/ 29 февраля 2012

Вот пример кода: Расширение только для чтения не работает для коллекции ссылочных типов. если бы я изменил Employee на string, это сработает. Может кто-нибудь объяснить, почему у меня такое поведение.

        List<Employee> Emps = new List<Employee>(2)
        {
            new Employee(){EmpName="E1",Year=2012,EmpID=1},
            new Employee(){EmpName="E2",Year=2012,EmpID=2}
        };
        Emps.ForEach(emp => Debug.WriteLine(emp.EmpName));
        **IList<Employee> readonlyEmp = Emps.AsReadOnly();
        readonlyEmp[0].EmpName = "EMPUpdated";**
        foreach (var emp in readonlyEmp)
        {
            Debug.WriteLine(emp.EmpName);
        }

1 Ответ

9 голосов
/ 29 февраля 2012

A ReadOnlyCollection предотвращает изменение ссылок в коллекции. Это не мешает модификации упомянутых объектов. Если у вас есть ReadOnlyCollection<string>, вы ничего не можете изменить, потому что string является неизменным. Ваш Employee класс изменчив и может быть изменен.

Таким образом, очевидным решением было бы сделать Employee неизменным. Сделайте свойства доступными только для чтения и инициализируйте их в конструкторе.

...