Registros C# 9.0 - tipos de referência não anuláveis ​​e construtor

Aug 15 2020

Eu tentei apenas um registro simples:

#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;
}

Eu recebo avisos:

A propriedade não anulável 'Nome' não foi inicializada. Considere declarar a propriedade como anulável.

(o mesmo para todos os campos, exceto CategoryId)

Basicamente, se bem entendi, um construtor aceitando e definindo todos os campos não é gerado automaticamente pelo compilador e (ao usar #nullable enable) tenho que escrevê-lo sozinho, ou seja:

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

Minha pergunta é, isso está correto? Estou muito surpreso com isso, pois pensei que o objetivo era tornar a criação de registros como esse realmente simples, e ter que escrever/manter o construtor é muito tedioso, especialmente em grandes registros que mudam com frequência. Ou estou perdendo alguma coisa aqui?

Respostas

3 IvanStoev Aug 15 2020 at 18:06

Você parece estar esperando o Construtor primário gerado automaticamente , mas ele é gerado automaticamente (e, em geral, você obtém todos os benefícios do registro) quando utiliza os parâmetros de registro na declaração do tipo de registro , que são mapeados automaticamente para público gete initpropriedades e inicializado automaticamente a partir do construtor primário, eliminando assim o aviso NRT.

O que significa que você obtém todo o açúcar do tipo de registro basicamente usando a sintaxe normal do construtor com a recordpalavra-chave adicionada:

public record Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) { }