Индексатор вернет копию значения. Внесение изменений в эту копию не повлияет на значение в словаре ... компилятор не дает вам писать ошибочный код. Если вы хотите изменить значение в словаре, вам нужно использовать что-то вроде:
// Note: copying the contents to start with as you can't modify a collection
// while iterating over it
foreach (KeyValuePair<string, MapTile> pair in tilesData.ToList())
{
MapTile tile = pair.Value;
tile.bgFrame = tile.bgFrame >= tile.bgAnimation ? 0 : tile.bgFrame + 1;
tilesData[pair.Key] = tile;
}
Обратите внимание, что также избегает многократного поиска без уважительной причины, как это делал ваш исходный код.
Лично я бы настоятельно рекомендовал против иметь изменяемую структуру для начала, заметьте ...
Конечно, другая альтернатива - сделать ее ссылочным типом, и в этот момент вы можете использовать:
// If MapTile is a reference type...
// No need to copy anything this time; we're not changing the value in the
// dictionary, which is just a reference. Also, we don't care about the
// key this time.
foreach (MapTile tile in tilesData.Values)
{
tile.bgFrame = tile.bgFrame >= tile.bgAnimation ? 0 : tile.bgFrame + 1;
}