Здравствуйте, vaa, Вы писали:
vaa>Здравствуйте, Sinclair, Вы писали:
S>>Не имеет значения. Definite assignment всё равно потребуется. Почему бы вам не попробовать просто скомпилировать ваш код?
vaa>Компилится, я сразу это проверил(dotnet core 6.0):
vaa>vaa>Person alice = new() { Name = "Alice" };
vaa>Person bob;
vaa>bob.Name = "Bob";
vaa>Person mary;
vaa>public struct Person { public string Name; }
vaa>
Да, вы правы — тонкая оговорка в стандарте: member access не требует definite assignment для структур. Интересно, только что у меня такой пример не компилировался в dotnetfiddle.
vaa>который не требует ключевого слова new(или это оператор?).
Это неверный способ думать о конструкторах. Внутри CLR конструктор — это обычный метод.
В рамках языка конструктор — это очень особенный метод, т.к. его нельзя вызвать напрямую.
Дело не в том, что "конструктор требует ключевого слова new" — вызвать (без reflection) конструктор на существующем объекте не получится хоть со словом new, хоть без.
Есть различные виды object initialization expression, которые подразумевают вызов конструктора. В некоторых из них есть ключевое слово new, в некоторых — нету.
Можно спровоцировать вызов конструктора перед другим конструктором — при помощи тех самых :this(...) и :base(...).
S>>Ограничения, о которых я говорю, они не синтаксические, а семантические.
vaa>понял