Enquanto estudava o delegado, que na verdade é uma classe abstrata Delegate.cs
, vi o seguinte método no qual não entendo
- Por que o valor de retorno usa,
?
embora já seja um tipo de referência ( classe ) ?[]?
significado no parâmetro
Você poderia explicar?
public static Delegate? Combine(params Delegate?[]? delegates)
{
if (delegates == null || delegates.Length == 0)
return null;
Delegate? d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
c#
.net
null-coalescing-operator
nullable-reference-types
null-coalescing
snr - Restabelecer Monica
fonte
fonte
Respostas:
Explicação passo a passo:
params Delegate?[] delegates
- É uma matriz de anulávelDelegate
params Delegate?[]? delegates
- A matriz inteira pode ser anulávelComo cada parâmetro é do tipo
Delegate?
e você retorna um índice daDelegate?[]?
matriz, faz sentido que o tipo de retorno seja oDelegate?
contrário, o compilador retornaria um erro como se você estivesse pesquisando novamente eint
de um método que retorne uma string.Você pode alterar, por exemplo, seu código para retornar um
Delegate
tipo como este:fonte
?
embora já seja do tipo de referência (classe)?
exatamente o mesmo motivo pelo qual o valor do argumento usa o?
. Se você entende o último, entende automaticamente o primeiro. Como o método pode retornar nulo , como o parâmetro pode aceitar nulo . Ou seja, ambos podem conter nulo .Since each parameter is of the type Delegate? and you return an index of the Delegate?[]? array, then it makes sense that the return type is Delegate?
Foo?
possui umaHasValue
propriedade elegante , ao passo queFoo
precisa ser== null
verificada (4) Comunica aos desenvolvedores que leem a assinatura do método que nulos são um resultado possível, esperado e correto. (5) O código parece ser escrito por alguém que gosta muito de nulidade e ser explícito sobre isso.Tipos de referência anuláveis são novos no C # 8.0, eles não existem antes.
É uma questão de documentação e como os avisos em tempo de compilação são produzidos.
A exceção "objeto não definido para uma instância de um objeto" é silenciosa e comum. Mas essa é uma exceção de tempo de execução, já pode ser parcialmente descoberta em tempo de compilação.
Para regular
Delegate d
você sempre pode ligarou seja, você pode codificá-lo, em tempo de compilação nada acontecerá. Pode gerar exceções em tempo de execução.
Enquanto para um novo
Delegate? p
este Códigoproduzirá um aviso do compilador.
CS8602: Dereference of a possibly null reference
a menos que você escreva:o que significa, chame apenas se não for nulo.
Portanto, você documenta uma variável que pode conter nulo ou não. Ele gera avisos mais cedo e pode evitar vários testes para nulo. O mesmo que você tem para int e int ?. Você sabe com certeza que um não é nulo - e sabe como converter um para o outro.
fonte
Delegate
não é nulo. Você apenas finge ter certeza (o que é bom o suficiente na maioria dos casos).int
ele nunca poderá ser nulo. Se você tiver umDelegate
, pode ser nulo (por várias razões, por exemplo, reflexão). Geralmente, é seguro assumir queDelegate
(no C # 8 com NRT ativado) não é nulo, mas você nunca sabe ao certo (ondeint
sabemos com certeza).No C # 8, deve-se marcar explicitamente os tipos de referência como nulos.
Por padrão, esses tipos não são capazes de conter nulos, um pouco semelhantes aos tipos de valor. Embora isso não mude o funcionamento das coisas, o verificador de tipos exigirá que você faça isso manualmente.
O código fornecido é refatorado para funcionar com o C # 8, mas não se beneficia desse novo recurso.
Aqui está um exemplo de um código atualizado (não funcionando, apenas uma idéia) aproveitando esse recurso. Ele nos salvou de uma verificação nula e simplificou um pouco esse método.
fonte
those types are not able to contain null
, observe que ele gera um aviso do compilador , não um erro. O código funcionará bem (embora possa gerar NullReferenceExceptions). Isso é feito com a compatibilidade com versões anteriores em mente.