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?

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.