備忘録
C# 8.0 から class 型と class? 型が区別されるようになり Null 安全性が高まったが、ジェネリクスでの Nullable の扱いが難しく、特に C# 8.0 と C# 9.0 以降で大きな違いがあるため、後者のスタイルで記述するときのまとめを備忘として記録する。
制約 | T として受け入れられる型のパターン | |||
struct | struct? | class | class? | |
where T : struct | ○ | × | × | × |
where T : class | × | × | ○ | × |
where T : class? | × | × | ○ | ○ |
where T : notnull | ○ | × | ○ | × |
制約なし | ○ | ○ | ○ | ○ |
指定不可 | ○ | ○ | × | × |
指定不可 | ○ | ○ | ○ | × |
結論としては C# 8.0 を用いる場合は記述環境が不完全なため「nullable enable にできるものの enable にせずに従来型で記述する」のが望ましく、新規プロジェクトでは C# 9.0 以降を用いて Null 安全に記述するのが望ましい。