Как изменить значение одного поля в структуре, которая находится в массиве структур?

Имеется структура "Test", в ней имеется строковое поле "Name". Так же имеется массив структур "ArrayTest", который наполнен структурами "Test", проблема в том, что при прохождении по данному массиву структур я изменяю поле "Name", передавая структуру по ссылке, но при следующем проходе все поля "Name" изначальные, то есть имеют значения, которые я присвоил при инициализации. Как можно обойти данную ситуацию?

public struct Test
{
  public String Name;

  public Test(String name)
  {
    this.Name = name;
  }
}

public Class A
{
  Test[,] ArrayTest;

  static void Main(string[] args)
  {
      int column = 0, row = 0;
      for(int i = 0; i<10; i++)
      {
        for(int j = 0; j<10; j++)
        {
          ArrayTest[column, row] = new Test("a");
          column++;
        }
        row++;
        column = 0;
      } 

      foreach (var t in ArrayTest)
         SetName(ref t, "b");

      foreach (var t in ArrayTest)
         Console.WriteLine(t.Name); //выводится "a"
  }

  public void SetName(ref Test t, String n)
  {
    t.Name = n; //Через отладчик видно, что значение присваивается, т.е. t.Name = "b"
  }
}

Ответы (1 шт):

Автор решения: PashaPash

Структуры - это value type. Они присваиваются по значению, полным копированием. Вот в этой строчке:

foreach (var t in ArrayTest)

вы получаете в переменной t копию структуры из массива.

Компилятор причем на это явно ругается:

CS1657  Cannot use 't' as a ref or out value because it is a 'foreach iteration variable'

Замените цикл на for и передавайте ссылку на структуре в массиве, а не на копию:

static void Main(string[] args)
{
    ArrayTest = new Test[10, 10];
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            ArrayTest[i, j] = new Test("a");
        }
    }

    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            SetName(ref ArrayTest[i, j], "b");
        }
    }

    foreach (var t in ArrayTest)
        Console.WriteLine(t.Name); //выводится "a"
}
→ Ссылка