Informações do tipo de referência anuláveis ​​não expostas a FirstOrDefault

10

Eu queria testar o novo recurso de tipos de referência anuláveis no C # 8.0.

Iniciei um novo projeto visando o .NET Core 3.0, habilitei os tipos de referência anuláveis ​​no .csprojarquivo e iniciei a codificação. Eu criei uma lista simples que recebe string[]ae retorna a stringque é igual a abc. Agora, como não tenho certeza de que abcrealmente exista na matriz, eu uso o FirstOrDefault()qual deve ser o padrão nullse uma correspondência não for encontrada.

using System;
using System.Linq;

public string FindArgument(string[] args)
{
    var arg = args.FirstOrDefault(x => x == "abc");
    return arg;
}

Meu método retorna string, que agora deve ser do tipo não anulável . Como FirstOrDefault()pode retornar null, eu esperaria que o método acima gerasse um aviso ao retornar a variável talvez nula arg . Isso não.

Observando a assinatura do FirstOrDefault()Visual Studio, fica claro o porquê : O método retorna a string, e não o equivalente anulável que string?eu esperaria.

Usar o corpo do método abaixo gera o aviso que eu esperava:

var arg = args.Contains("abc") ? "abc" : null;
return arg;

As bibliotecas do sistema (neste exemplo System.Linq) realmente não expõem informações de nulidade ao direcionar o .NET Core 3.0?

Thorkil Holm-Jacobsen
fonte

Respostas:

9

Parece que System.Linqnão é anulável anotado na versão 3.0. Os tipos de referência anuláveis ​​não emitem o aviso correto.

Você pode verificar problemas semelhantes no repositório roslyn . Esta questão em aberto no Github é muito semelhante ao seu problema. Nessa edição, um colaborador explica o problema atual:

System.Linqé anulável anotado na ramificação principal do corefx, mas não na liberação / 3.0 . Portanto, não há nada inesperado no compilador. O compilador deve fornecer alguns diagnósticos mostrando que você está usando coisas que não podem ser anuladas.

piratas
fonte
Para adicionar isso, você pode usar este pacote para obter as anotações corretas hoje.
precisa saber é o seguinte
11
Este ainda é o caso no .NET Core 3.1. Isso torna o trabalho com tipos de referência anuláveis ​​menos agradável. Eu acredito que a solicitação de recebimento corefx / pull / 40651 corrige isso, mas aparentemente teremos que esperar até o .NET 5 para obter isso :-(
Jeppe Stig Nielsen