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 == nullriga mi dia un avvertimento, dopo tutto sè chiaramente non annullabile, quindi confrontarla con nullnon 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 scon 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 == nulllinea non vengono generati avvisi e perché CS8602quando non sembra nullpossibile 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é snon è nullable. Non diventa nullable, semplicemente perché eravamo abbastanza stupidi da confrontarlo null.