Dopo aver letto questa domanda su HNQ, ho continuato a leggere su Nullable Reference Tipi in C # 8 e ho fatto alcuni esperimenti.
Sono consapevole che 9 volte su 10, o anche più spesso, quando qualcuno dice "Ho trovato un bug del compilatore!" questo è in realtà di progettazione e il loro malinteso. E da quando ho iniziato a esaminare questa funzione solo oggi, chiaramente non ho una buona comprensione di essa. Con questo fatto, diamo un'occhiata a questo codice:
#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
}
}
Dopo aver letto la documentazione che ho collegato sopra, mi aspetto che la s == null
riga mi dia un avvertimento, dopo tutto s
è chiaramente non annullabile, quindi confrontarla con null
non ha senso.
Invece, sto ricevendo un avviso sulla riga successiva e l'avviso dice che s
è possibile un riferimento null, anche se, per un essere umano, è ovvio che non lo è.
Inoltre, l'avviso non viene visualizzato se non confrontiamo s
con null
.
Ho fatto un po 'di googling e ho riscontrato un problema con GitHub , che si è rivelato riguardare qualcos'altro, ma nel frattempo ho avuto una conversazione con un collaboratore che ha fornito ulteriori informazioni su questo comportamento (ad esempio "I controlli null sono spesso un modo utile di dire al compilatore di ripristinare la sua precedente inferenza sulla nullità di una variabile. " ). Questo mi ha comunque lasciato senza risposta la domanda principale.
Piuttosto che creare un nuovo numero di GitHub e potenzialmente occupare il tempo dei partecipanti al progetto incredibilmente impegnati, lo sto diffondendo alla comunità.
Potresti spiegarmi cosa sta succedendo e perché? In particolare, perché sulla s == null
linea non vengono generati avvisi e perché CS8602
quando non sembra null
possibile fare riferimento qui? Se l'inferenza di nullability non è a prova di proiettile, come suggerisce il thread GitHub collegato, come può andare storto? Quali sarebbero alcuni esempi di ciò?
?
perché s
non è nullable. Non diventa nullable, semplicemente perché eravamo abbastanza stupidi da confrontarlo null
.