Честно говоря, главная ошибка здесь почти наверняка: наличие изменяемой структуры. Теперь есть сценарии, в которых изменяемые структуры имеют смысл, но эти сценарии узкие , и это почти наверняка не один из них.
Честно говоря, ваш код будет намного проще рационализировать, если вы перестанете это делать ; в недавнем C # вы даже можете использовать readonly struct
, чтобы помочь реализовать это (и улучшить поведение с помощью in
):
public readonly struct Slab
{ public readonly float[] sizeM;
public readonly string textureSrc;
//more members, not relevant here...
}
(лично я бы также рассматривал свойства вместо открытых полей, но это отдельная проблема)
Тогда становится очевидным, что вы можете назначить только весь объект:
Slab? foo = ...
... some logic
foo = new Slab(size, textureSource); // perhaps taking new values from the old
Единственная другая альтернатива - это в основном , чтобы делать то же самое в любом случае :
Slab? foo = ...
// ...
var innerVal = foo.GetValueOrDefault(); // or .Value if you've already null-checked
// ...
innerVal.textureSrc = ...
foo = innerVal;