HNQでこの質問を読んだ後、C#8のNullable参照型について読み、いくつかの実験を行いました。
誰かが「コンパイラのバグを見つけた!」と言ったとき、私は10回のうち9回、またはもっと頻繁にそれを知っています。これは実際には仕様によるものであり、彼ら自身の誤解です。そして、私がこの機能を調べ始めたのは今日だけなので、明らかに私はそれをあまりよく理解していません。これが邪魔にならないように、このコードを見てみましょう:
#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
}
}
上記にリンクしたドキュメンテーションを読んだ後、私はそのs == null
行が私に警告を与えると期待します—結局のところs
null可能でnull
はないので、それを比較しても意味がありません。
代わりに、次の行に警告が表示され、警告はs
null参照の可能性があることを示していますが、人間にとってはそうではないことは明らかです。
もっとオーバー、警告はされていない、我々は比較しない場合に表示s
しますnull
。
私はいくつかグーグルを実行し、GitHubの問題にぶつかりました。これはまったく別の問題であることが判明しましたが、その過程で、この動作についてさらに洞察を与える寄稿者と会話しました(たとえば、「ヌルチェックは多くの場合、有用な方法です変数のNULL可能性に関する以前の推論をリセットするようコンパイラーに指示する方法。」)。しかし、それでもまだ主な質問には答えられませんでした。
新しいGitHubの問題を作成し、プロジェクトの非常に忙しいコントリビューターの時間を費やす可能性があるのではなく、これをコミュニティに公開します。
何が起こっているのか、その理由を教えてください。特に、s == null
ラインで警告が生成されないのはなぜ ですか。また、ここで参照が可能CS8602
ではないように思われるのに、なぜ表示さnull
れるのでしょうか。リンクされたGitHubスレッドが示唆しているように、null可能性の推論が完全ではない場合、どのようにして失敗するのでしょうか?その例は何でしょうか?
?
ため、必要s
はありません。と比較するのに愚かだったからといって、null可能にはなりませんnull
。