Eu ativei esse recurso em um projeto com classes de objeto de transferência de dados (DTO), conforme indicado abaixo:
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
Mas eu recebo o erro:
CS8618
: A propriedade não anulável 'ServiceUrl' não foi inicializada. Considere declarar a propriedade como anulável.
Esta é uma classe DTO, por isso não estou inicializando as propriedades. Isso será de responsabilidade do código que inicializou a classe para garantir que as propriedades sejam não nulas.
Por exemplo, o chamador pode fazer:
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
Minha pergunta: como lidar com esses erros nas classes DTO quando o contexto de nulidade do C # 8 está ativado?
Plain Old C# Object
. Apenas um objeto como outro qualquer, sem herdar de nenhuma classe especial. Eu suspeito que você tem uma pergunta diferente . Como criar DTOs -Data Transfer Objects
This should be the responsibility of the one initializing the class to ensure that the properties are non-null
a classe deve estar sempre em um estado válido. Senull
não for permitido, a propriedade nunca deve ser nula. Talvez, em vez de uma string básica, você deva usar uma classe especializada para a URL que possa ter um valor deNone
ou `Missing`, como a classe Option em F #. C # 8 permite que você escreva tais classes e verificá-los com correspondência de padrãopublic string ServiceUrl { get; set; } = default! ;
. Espero que Roslyn possa ter no futuro uma maneira de lidar com a inicialização tardia fora do escopo do ctor. Eu estava usando MayBe <T> (como a classe Option), mas mudei para Tipo de referência anulável em c # 8 para o novo código.Respostas:
A próxima solução é recomendada pelo EF Core e EF6, consulte
1) Inicializando
null!
com o operador que perdoa2) Usando o campo de apoio:
fonte
!
operador.Se não for anulável, o que o compilador pode fazer quando o objeto for inicializado?
O valor padrão da sequência é nulo, portanto, você
precisa atribuir um valor padrão de sequência na declaração
public string ServiceUrl { get; set; } = String.Empty;
Ou inicialize o valor no construtor padrão para que você se livre do aviso
Use o
!
operador (que você não pode usar)Torne-o nulo como robbpriestley mencionado.
fonte
ServiceUrl'
não pode ser = String.Empty. Existem outras propriedades do tipo complexo que não podem ser nulas, então eu useidefault
como: 'public MyClass MyProperty {get; conjunto; } = padrão! 'para parar o aviso. Essa classe (e outras) é construtora sem parâmetros e é inicializada recentemente fora do escopo do ctor.Outra coisa que pode ser útil em alguns cenários:
Pode ser usado em cima do membro ou do tipo inteiro.
Outra coisa a considerar é adicionar
#nullable disable
no topo do arquivo para desativar a referência anulável para todo o arquivo.fonte