Ну, для начала вы создаете изменяемую структуру - это почти всегда очень плохая идея . Изменчивые структуры могут иногда вести себя так, как вы этого не ожидаете. Ладно, он может изменяться только в частном порядке , но тот факт, что вы написали код для его изменения, является плохим признаком.
Причиной второй ошибки является то, что вы не можете использовать какие-либо свойства или методы структуры, пока не будут назначены все поля, поэтому вам нужно связать с неявным конструктором без параметров:
public T(int u) : this()
{
this.U = 10;
}
Компилятор требует, чтобы любой конструктор оставил все поля определенно назначенными (именно поэтому вы раньше получали ошибку first ; компилятор не «знает», что свойство присваивает полю значение) - приковав цепью к this()
, вы убедитесь, что к тому времени, когда вы доберетесь до своего тела конструктора, все поля будут уже определенно назначены, и вам больше не нужно об этом беспокоиться .
Однако, если вы на самом деле не хотите разрешить мутацию, я предлагаю вам просто сделать это свойство доступным только для чтения:
struct T
{
private readonly int u;
public T(int u)
{
this.u = 10;
}
public int U { get { return u; } }
}
Теперь более очевидно , что вы не хотите изменять его даже внутри самой структуры .