null許容(null許容値型/null許容参照型)についてのメモ

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

タイトルとは別のしらべものをしているときに、 null許容について知らないことがいろいろわかった気がしたので、理解したかどうかはおいておいて、忘れたくないものを取り急ぎメモ。

別のしらべもの → 型パラメーターの制約条件

メモ

  • C#に「null許容」自体は、昔からある。多分C#2.0頃から。

  • 但し、そのころでいう「null許容」とは、今(C#8.0以降)でいうところの「null許容値型」のこと。

  • null許容値型は、内部で「Nullable型」になっている。

    • 例えばint型だと、「int?型」と「Nullable<int>」は同じ。
  • 参照型には、元々nullを入れることができていた。

    • nullポインタ的なもの?
  • C#8.0以降は、「null許容参照型」が」追加された。

  • VisualStudio2022の下の画面で「Null許容」を有効/無効できるが、その「Null許容」と言われているのが、C#8.0で追加された「null許容参照型」のこと。

  • つまりこの画面は、「null許容参照型」の有効/無効が切り替えられる画面である。

  • null許容参照型を有効にすると、

    • まずnull非許容(?のついてない)参照型にnullを入れることを禁止したうえで、
    • null許容参照型には、nullを入れられるようにする
  • VisualStudioで「Null許容」の設定を無効にしても、C#2.0のころからできていたint?などのnull許容値型が書けなくはならない。

    • あくまで、VSのその設定は「null非許容参照型にnullを入れることを禁止」するかどうかの切り替えである。
  • null非許容参照型にnullを入れることを禁止、といっても、標準ではワーニングがでるだけで、エラーにはならない。出るワーニングはこんな感じ。(ワーニングをエラー扱いする設定だとエラーになるので、破壊的ではある)

  • 参照型に?を付けると、null許容参照型になる。

  • ただし、null許容参照型Tは、null非許容参照型T?と、中身としては変わらない。

    • 昔からnullが入るので、実は中身的には変わってないらしい
    • ?は、コンパイラに、null許容なのか非許容なのかを伝えるだけの役割
    • 値型は、null許容にするとNullable<T>になり、全然別物になる

参考

ufcppを見て勉強した。

null 許容参照型

https://ufcpp.net/study/csharp/resource/nullablereferencetype/

null許容値型(Nullable 型)

https://ufcpp.net/study/csharp/sp2_nullable.html