Обязательная инициализация record struct
От: vaa  
Дата: 18.02.22 08:05
Оценка:
Обычный 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


Будто это класс какой-нибудь.
Почему так?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Обязательная инициализация record struct
От: rameel https://github.com/rsdn/CodeJam
Дата: 18.02.22 08:54
Оценка: +1
Здравствуйте, 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>>
Re: Обязательная инициализация record struct
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.02.22 08:55
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>Почему так?


При отсутствии у структуры конструкторов как бы генерируется пустой и ее можно просто объявлять без инициации. Если в структуре определить непустой конструктор, то пустой сгенерирован не будет. В случае record конструктор генерируется непустой, значит, доступ к членам без упоминания конструктора не будет доступен. Т.е. не сам record решает, а именно наличие конструктора.
Re: Обязательная инициализация record struct
От: Mr.Delphist  
Дата: 18.02.22 09:13
Оценка: +1
Здравствуйте, 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-значения в конструктор не передали, а что там будет дальше хз — это ж синтезируемое поле. Так что, здесь надо примкнуть либо к умным, либо к красивым — в серединке попрыгать не получится.

Варианты:

P.S. ярлычки "умный/красивый" можно менять местами
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.