2012-02-29 63 views
4

以下是示例代码: 只读扩展不适用于引用类型集合。如果我将员工更改为字符串,那么它将起作用。 有人可以解释为什么我得到这种行为。IList <T> .AsReadOnly扩展方法不适用于引用类型集合

 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); 
     } 

回答

9

A ReadOnlyCollection防止修改集合中的引用。它不会阻止对引用对象的修改。如果你有一个ReadOnlyCollection<string>,你不能改变任何东西,因为string是不可变的。你的Employee类是可变的,可以改变。

所以明显的解决办法是使Employee不可变。使属性只读并在构造函数中初始化它们。

+0

Thanks.Got it.so asreadonly()扩展方法只防止COUNT如果对象是可变的。 – mahalingam 2012-02-29 10:05:31

+1

@mahalingam只读集合不能添加,删除或**交换**;例如,你可以做一个可变集合'list [24] = anotherValue;' - 你不能用只读集合来做到这一点。所以它不只是数量。 – 2012-02-29 10:21:05

+1

不仅是元素的数量,还有对单个元素的引用:即使不会更改Count,您也不能执行readonlyEmp [0] = new Employee();'。 – 2012-02-29 10:22:04

相关问题