Nachdem ich diese Frage auf HNQ gelesen hatte, las ich weiter über nullable Reference Types in C # 8 und machte einige Experimente.
Ich bin mir sehr bewusst, dass 9 von 10 oder noch öfter, wenn jemand sagt "Ich habe einen Compiler-Fehler gefunden!" Dies ist eigentlich beabsichtigt und ihr eigenes Missverständnis. Und da ich mich erst heute mit dieser Funktion befasst habe, habe ich offensichtlich kein sehr gutes Verständnis dafür. Schauen wir uns diesen Code an:
#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
}
}
Nachdem ich die Dokumentation gelesen habe, auf die ich oben verlinkt habe, würde ich erwarten, dass die s == null
Zeile eine Warnung s
ausgibt - schließlich ist sie eindeutig nicht nullwertfähig, sodass ein Vergleich mit null
nicht sinnvoll ist.
Stattdessen erhalte ich in der nächsten Zeile eine Warnung , und die Warnung besagt, dass s
dies eine Nullreferenz ist, obwohl es für einen Menschen offensichtlich ist, dass dies nicht der Fall ist.
Mehr über, wird die Warnung nicht , wenn wir vergleichen nicht angezeigt s
zu null
.
Ich habe ein bisschen gegoogelt und bin auf ein GitHub-Problem gestoßen , bei dem es sich um etwas ganz anderes handelte, aber dabei hatte ich ein Gespräch mit einem Mitwirkenden, der mehr Einblick in dieses Verhalten gab (z. B. "Nullprüfungen sind oft ein nützlicher Weg." den Compiler anzuweisen, seine vorherige Schlussfolgerung über die Nullfähigkeit einer Variablen zurückzusetzen. " ). Dies ließ mich jedoch mit der Hauptfrage unbeantwortet.
Anstatt ein neues GitHub-Problem zu erstellen und möglicherweise die Zeit der unglaublich beschäftigten Projektmitarbeiter in Anspruch zu nehmen, stelle ich dies der Community zur Verfügung.
Könnten Sie mir bitte erklären, was los ist und warum? Insbesondere , warum auf der keine Warnungen generiert s == null
Linie, und warum haben wir , CS8602
wenn es scheint nicht , wie eine null
Referenz hier möglich ist? Wenn die Inferenz der Nullbarkeit nicht kugelsicher ist, wie der verknüpfte GitHub-Thread andeutet, wie kann es dann schief gehen? Was wären einige Beispiele dafür?
?
da s
nicht nullbar ist. Es wird nicht nullbar, einfach weil wir dumm genug waren, es damit zu vergleichen null
.