Обычный struct можно было объявить без инициализации (как в си?):
public struct Foo { public string Name; }
Foo foo;
foo.Name = "Alice";
public record struct Boo(string Name);
// Boo boo;
// boo.Name = "Alice"; <= error CS0165: Использование локальной переменной "boo", которой не присвоено значение.
Boo boo = new("Alice"); // <= OK
Будто это класс какой-нибудь.
Почему так?
Здравствуйте, vaa, Вы писали:
vaa>Почему так?
Потому что в рекорде объявлется свойство, а не поле. То же самое будет и с обычной структурой
Foo f;
f.Name = ""; // error CS0165: Use of unassigned local variable 'f'
public struct Foo
{
public string Name { get; set; }
}
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Здравствуйте, vaa, Вы писали:
vaa>vaa> public record struct Boo(string Name);
vaa> // Boo boo;
vaa> // boo.Name = "Alice"; <= error CS0165: Использование локальной переменной "boo", которой не присвоено значение.
vaa> Boo boo = new("Alice"); // <= OK
vaa>
Такое объявление предполагает, что у структуры Boo нет дефолтного конструктора. Поэтому компилятор понятия не имеет, как правильно инстанциировать Name: primary-значения в конструктор не передали, а что там будет дальше хз — это ж синтезируемое поле. Так что, здесь надо примкнуть либо к умным, либо к красивым — в серединке попрыгать не получится.
Варианты:
умный: инстанциировать boo в соответствии с сигнатурой primary-конструктора
красивый: явно описать Name как поле структуры (вместо сигнатуры primary-конструктора)
P.S. ярлычки "умный/красивый" можно менять местами