Let say I have a very simple reference type called Person
.
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
I use LINQ to create an IEnumerable call peopleEnum
with the following code.
var ages = new int[] { 1, 2, 3, 4, 5 };
var peopleEnum = ages.Where(a => a > 1)
.Select(a => new Person
{
Name = a.ToString(),
Age = a
});
My understanding is because Person
is reference type, the elements inside peopleEnum
should be mutable. But I found out that they are not.
var person = peopleEnum.Single(p => p.Age == 4);
person.Name = "Four";
foreach (var p in peopleEnum)
{
Console.WriteLine($"{p.Name}, {p.Age}");
}
Expected output.
2, 2
3, 3
Four, 4
5, 5
Actual output.
2, 2
3, 3
4, 4
5, 5
However, if I create IEnumerable<Person>
in a different way.
var people = new Person[]
{
new Person{ Name = "1", Age = 1 },
new Person{ Name = "2", Age = 2 },
new Person{ Name = "3", Age = 3 },
new Person{ Name = "4", Age = 4 },
new Person{ Name = "5", Age = 5 },
};
var peopleEnum2 = people.Where(p => p.Age > 1);
Then elements inside peopleEnum2
will be mutable.
var person = peopleEnum2.Single(p => p.Age == 4);
person.Name = "Four";
foreach (var p in peopleEnum2)
{
Console.WriteLine($"{p.Name}, {p.Age}");
}
Output
2, 2
3, 3
Four, 4
5, 5
What rules determine whether elements inside an IEnumerable<T>
are mutable or not?