записи в C# 9.0 и допускающие значения NULL

Я пробую новые функции записи, используя последнюю версию.Net5

  public record Rec {
    public string Name;
    public int Id;
    //public Rec(string name, int id) => (Name, Id) = (name, id);
  }

я получил

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

Значит, конструктор не создается, а я понял, что это особенность записей?
и почему не такое же предупреждение дляId?
Если я не отмечу ctor выше, предупреждение исчезнет (что имеет смысл)

Также, если я это сделаю:

public record Rec(string Name, int Id);

Предупреждений нет.

РЕДАКТИРОВАТЬ

поэтому кажется, что две формы создания записи (более длинный и более короткий синтаксис) различаются, короткая версия делает поля общедоступными, а также добавляет ctor, тогда как первая - нет. Я не могу найти ссылку на это.

1 ответ

Решение

Значит, конструктор не создается, а я понял, что это особенность записей?

Согласно документации: Первичный конструктор синтезируется для всех параметров значений списка параметров для позиционной записи.

В вашем первом примере нет списка параметров и, следовательно, параметров значений, поэтому он не является позиционной записью и, следовательно, не имеет первичного конструктора.

и почему не такое же предупреждение для Id?

Поскольку конструктор по умолчанию дляint есть и всегда было 0не null. Это не совсем конкретно дляrecords, так было всегда, еще до C# 1.0.

Другие вопросы по тегам