Re[5]: Тонкости инициализации
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.01.22 10:42
Оценка:
Здравствуйте, 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>понял
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.