Вы должны понимать ключевые различия между структурами ( Типы значений ) и классами ( Тип ссылки ).Вы можете легко найти эту информацию в Google или в SO .
Когда вы добавляете экземпляр структуры в список, вы создаете другую отдельную копию для этого экземпляра, а также приодин элемент, который вы не изменили, другой.
Но в случае классов вы создаете один экземпляр и используете этот «общий» экземпляр с двумя ссылками (list [0] и list 1 ) иВы можете изменить этот экземпляр с помощью двух разных ссылок, поэтому при изменении элемента списка [0] кажется, что вы также изменили элемент списка 1 .
Рассмотрите следующий код:
var s1 = new SampleStruct { X = 1, Y = 1 };
var s2 = s1;
//Creating separate copy
//Lets check this
Console.WriteLine(object.ReferenceEquals(s1, s2)); //Prints False
var c1 = new SampleClass { X = 1, Y = 2 };
var c2 = c1;
//We do not create any copy
// two references c1 and c2 "pointed" to one shared object
Console.WriteLine(object.ReferenceEquals(c1, c2)); //Prints True
Подобное поведение мы имеем, когда передаем параметр в функцию (или добавляем элемент в список).