Depois de ler esta pergunta no HNQ, passei a ler sobre tipos de referência nulos no C # 8 e fiz algumas experiências.
Estou ciente de que 9 vezes em 10, ou ainda mais frequentemente, quando alguém diz "Encontrei um bug do compilador!" isso é realmente por design e por seu próprio mal-entendido. E desde que comecei a examinar esse recurso somente hoje, claramente não tenho um entendimento muito bom dele. Com isso fora do caminho, vamos olhar para este código:
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
Depois de ler a documentação a que vinculei acima, esperaria que a s == null
linha me desse um aviso - afinal de contas s
é claramente não nulo, portanto, compará-la com null
não faz sentido.
Em vez disso, estou recebendo um aviso na próxima linha, e o aviso diz que s
é possível uma referência nula, mesmo que, para um humano, seja óbvio que não.
Além disso, o aviso não será exibido se não compararmos s
com null
.
Eu pesquisei no Google e encontrei um problema do GitHub , que acabou por ser sobre algo totalmente diferente, mas no processo tive uma conversa com um colaborador que forneceu mais informações sobre esse comportamento (por exemplo, "Verificações nulas geralmente são uma maneira útil de dizer ao compilador para redefinir sua inferência anterior sobre a nulidade de uma variável. " ). Isso ainda me deixou com a pergunta principal sem resposta, no entanto.
Em vez de criar um novo problema no GitHub e potencialmente ocupar o tempo dos colaboradores incrivelmente ocupados do projeto, estou divulgando isso para a comunidade.
Poderia me explicar o que está acontecendo e por quê? Em particular, por que nenhum aviso é gerado na s == null
linha e por que temos CS8602
quando parece que uma null
referência não é possível aqui? Se a inferência de nulidade não é à prova de balas, como sugere o encadeamento do GitHub vinculado, como isso pode dar errado? Quais seriam alguns exemplos disso?
?
porque s
não é anulável. Não se torna anulável, simplesmente porque éramos tolos o suficiente para compará-lo null
.