Registros C# 9.0 - tipos de referência não anuláveis e construtor
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
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 record
palavra-chave adicionada:
public record Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) { }