Après avoir lu cette question sur HNQ, j'ai continué à lire sur les types de référence Nullable en C # 8 et j'ai fait quelques expériences.
Je suis très conscient que 9 fois sur 10, voire plus souvent, quand quelqu'un dit "J'ai trouvé un bug de compilation!" c'est en fait par conception, et leur propre malentendu. Et depuis que j'ai commencé à étudier cette fonctionnalité seulement aujourd'hui, je ne l'ai clairement pas très bien comprise. Avec cela à l'écart, regardons ce code:
#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
}
}
Après avoir lu la documentation que j'ai liée à ci-dessus, je m'attendrais à ce que la s == null
ligne me donne un avertissement - après tout, il s
est clairement non nul, donc la comparer à null
n'a pas de sens.
Au lieu de cela, je reçois un avertissement sur la ligne suivante , et l'avertissement dit que s
c'est possible une référence nulle, même si, pour un humain, il est évident que ce n'est pas le cas.
De plus, l'avertissement ne s'affiche pas si nous ne comparons pas s
à null
.
J'ai fait quelques recherches sur Google et j'ai rencontré un problème avec GitHub , qui s'est avéré être quelque chose de complètement différent, mais au cours du processus, j'ai eu une conversation avec un contributeur qui a donné un aperçu de ce comportement (par exemple, "les vérifications nulles sont souvent un moyen utile de dire au compilateur de réinitialiser son inférence précédente sur la nullité d'une variable. " ). Cela m'a cependant laissé la question principale sans réponse.
Plutôt que de créer un nouveau problème GitHub, et de prendre potentiellement le temps des contributeurs du projet incroyablement occupés, je mets cela à la disposition de la communauté.
Pourriez-vous m'expliquer ce qui se passe et pourquoi? En particulier, pourquoi aucun avertissement n'est généré sur la s == null
ligne, et pourquoi avons-nous CS8602
quand il ne semble pas qu'une null
référence soit possible ici? Si l'inférence de nullité n'est pas à l'épreuve des balles, comme le suggère le thread GitHub lié, comment peut-il mal tourner? Quels seraient quelques exemples de cela?
?
car il s
n'est pas nullable. Il ne devient pas annulable, simplement parce que nous étions assez stupides pour le comparer null
.