Les informations de type de référence nul ne sont pas exposées à partir de FirstOrDefault

10

Je voulais tester la nouvelle fonctionnalité de types de référence nullable dans C # 8.0.

J'ai commencé un nouveau projet ciblant .NET Core 3.0, activé les types de référence nullables dans le .csprojfichier et commencé à coder. J'ai créé une liste simple qui prend un string[]et renvoie le stringdans ce tableau qui est égal à abc. Maintenant, parce que je ne suis pas certain qu'il abcexiste réellement dans le tableau, j'utilise FirstOrDefault(), qui devrait par défaut nullsi aucune correspondance n'est trouvée.

using System;
using System.Linq;

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

Ma méthode retourne string, qui devrait maintenant être du type non nullable . Depuis FirstOrDefault()mai retour null, je m'attendrais à ce que la méthode ci-dessus génère un avertissement lors du retour de la variable peut - être nullearg . Ce ne est pas.

En regardant la signature pour FirstOrDefault()dans Visual Studio, il est clair pourquoi : La méthode renvoie un string, pas l'équivalent nullable string?que j'attendrais.

L'utilisation du corps de méthode ci-dessous donne l'avertissement auquel je m'attendais:

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

Les bibliothèques système (dans cet exemple System.Linq) n'exposent-elles vraiment pas les informations de nullité lors du ciblage de .NET Core 3.0?

Thorkil Holm-Jacobsen
la source

Réponses:

9

Il semble que l' System.Linqannotation ne puisse pas être annulée dans la version 3.0. Les types de référence Nullable n'émettent donc pas l'avertissement correct.

Vous pouvez vérifier des problèmes similaires dans le dépôt roslyn . Ce problème ouvert sur Github est très similaire à votre problème. Dans ce numéro, un contributeur explique le problème actuel:

System.Linqest annulable annoté maître branche corefx, mais pas en version / 3.0 . Il n'y a donc rien d'inattendu dans le compilateur. Le compilateur doit fournir des diagnostics montrant que vous utilisez des éléments nullables-inconscients.

pirates
la source
Pour ajouter à cela, vous pouvez utiliser ce package pour obtenir les bonnes annotations aujourd'hui.
canton7
1
C'est toujours le cas dans .NET Core 3.1. Cela rend le travail avec les types de référence nullable moins agréable. Je crois que la requête de tirage corefx / pull / 40651 corrige cela, mais apparemment, nous devrons attendre .NET 5 pour l'obtenir :-(
Jeppe Stig Nielsen