Записи C# 9.0 - ссылочные типы и конструктор, не допускающие значения NULL

Я пробовал простую запись:

#nullable enable

public record Product
{
    public readonly string Name;
    public readonly int CategoryId;
    public readonly string Phone;
    public readonly Address Address;
    public readonly Manager Manager;
}

Я получаю предупреждения:

Свойство Name, не допускающее значения NULL, не инициализировано. Рассмотрите возможность объявления свойства как допускающего значение NULL.

... то же самое для всех полей, кроме CategoryId

В основном, если я правильно понимаю, конструктор, принимающий и устанавливающий все поля, не генерируется автоматически компилятором и (при использовании#nullable enable) Я должен написать это сам, т.е.

public Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) {
  this.Name=Name;
  this.CategoryId=CategoryId;
   ...
}

Мой вопрос, это правильно? Я очень удивлен этим, так как я думал, что все дело в том, чтобы сделать создание таких записей действительно простым, а необходимость писать / поддерживать ctor очень утомительна, особенно для больших записей, которые часто меняются. Или мне что-то здесь не хватает?

1 ответ

Решение

Кажется, вы ожидаете автоматически сгенерированного первичного конструктора, но он автоматически создается (и в целом вы получаете все преимущества записи), когда вы используете параметры записи в объявлении типа записи, которые автоматически сопоставляются с общедоступнымиget а также initproperties и автоматически инициализируется из основного конструктора, что устраняет предупреждение NRT.

Это означает, что вы получаете весь сахар типа записи, в основном используя синтаксис обычного конструктора с добавленным record ключевое слово:

public record Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) { }
Другие вопросы по тегам