How to make IEnumerable readonly?

前端 未结 8 656
臣服心动
臣服心动 2021-02-07 12:23

Why are the lists list1Instance and p in the Main method of the below code pointing to the same collection?

class Person
         


        
8条回答
  •  夕颜
    夕颜 (楼主)
    2021-02-07 13:04

    This code returns a derived class, so as requested the return type hasn't changed.

    It does throw an error if you try and change a field (via property) so is 'read only'. If you did want to be able to change values without affecting the original the clone answer above is better.

    class  Person
    {
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
    
    
        public Person(string firstName, string lastName) {
            this.FirstName = firstName;
            this.LastName = lastName;
        }
    
    }
    
    class PersonReadOnly : Person
    {
        public override string FirstName { get { return base.FirstName; } set { throw new Exception("setting a readonly field"); } }
        public override string LastName { get { return base.LastName; } set { throw new Exception("setting a readonly field"); } }
    
        public PersonReadOnly(string firstName, string lastName) : base(firstName, lastName)
        {
        }
        public PersonReadOnly(Person p) : base(p.FirstName, p.LastName)
        {
    
        }
    
    }
    
    class List1
    {
        public List l1 = new List();
    
        public List1()
        {
            l1.Add(new Person("f1", "l1"));
            l1.Add(new Person("f2", "l2"));
            l1.Add(new Person("f3", "l3"));
            l1.Add(new Person("f4", "l4"));
            l1.Add(new Person("f5", "l5"));
        }
        public IEnumerable Get()
        {
            foreach (Person p in l1)
            {
                yield return new PersonReadOnly(p);
            }
            //return l1.AsReadOnly(); 
        }
    
    }  
    class Program
    {
    
        static void Main(string[] args)
        {
            List1 list1Instance = new List1();
    
            List p = new List(list1Instance.Get());           
    
            UpdatePersons(p);
    
            bool sameFirstName = (list1Instance.l1[0].FirstName == p[0].FirstName);
        }
    
        private static void UpdatePersons(List list)
        {
            // readonly message thrown
            list[0].FirstName = "uf1";
        }
    

提交回复
热议问题