Informazioni sul tipo di riferimento annullabili non esposte da FirstOrDefault


10

Volevo testare la nuova funzionalità dei tipi di riferimento nullable in C # 8.0.

Ho avviato un nuovo progetto destinato a .NET Core 3.0, abilitato i tipi di riferimento nullable nel .csprojfile e ho iniziato a scrivere codice. Ho creato un semplice elenco che accetta un string[]e restituisce stringin quell'array che è uguale abc. Ora, poiché non sono sicuro che abcesista effettivamente nell'array, lo uso FirstOrDefault(), che dovrebbe essere predefinito nullse non viene trovata una corrispondenza.

using System;
using System.Linq;

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

Il mio metodo restituisce string, che ora dovrebbe essere il tipo non annullabile . Dal momento che FirstOrDefault()può tornare null, mi aspetterei che il metodo sopra riportato fornisca un avviso quando restituisce la variabile forse nulla arg . Non è così.

Guardando la firma per FirstOrDefault()in Visual Studio, è chiaro perché : il metodo restituisce un string, non l'equivalente nullable che string?mi aspetterei.

L'uso del metodo seguente mostra l'avvertimento che mi aspettavo:

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

Le librerie di sistema (in questo esempio System.Linq) non espongono davvero le informazioni di nullability quando si utilizza .NET Core 3.0?

Risposte:


9

Sembra che System.Linqnon sia annullabile annotato nella versione 3.0. Pertanto, i tipi di riferimento Nullable non emettono l'avviso corretto.

È possibile verificare problemi simili nel repository Roslyn . Questo problema aperto su Github è molto simile al tuo problema. In quel numero un collaboratore spiega l'attuale problema:

System.Linqè nullable annotato nel ramo master di corefx, ma non nella versione / 3.0 . Quindi non c'è nulla di inaspettato nel compilatore. Il compilatore dovrebbe fornire alcuni dati diagnostici che dimostrano che stai utilizzando oggetti nullable-ignari.


Per aggiungere a questo, è possibile utilizzare questo pacchetto per ottenere le annotazioni giuste oggi.
canton7,

1
Questo è ancora il caso in .NET Core 3.1. Rende meno piacevole lavorare con tipi di riferimento nullable. Credo che la richiesta pull corefx / pull / 40651 risolva questo problema, ma apparentemente dovremo aspettare fino a .NET 5 per ottenerlo :-(
Jeppe Stig Nielsen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.