CS8618 - null 非許容の変数には、コンストラクターの終了時に null 以外の値が入っていなければなりません
Programming
公開: 2022-04-20
これはなんなのか
C# 8.0 で null 許容参照型が導入され、その副作用として従来の参照型は null 非許容参照型として扱われるようになりました。null 非許容参照型の変数は非 null に初期化されない場合、コンパイル警告が発生します。そのため、C# 8.0 より前のコードを新しいバージョンに移行すると高確率で警告が発生することになります。
null 許容参照型
null 許容参照型
メモリとリソース管理 null 許容参照型
コンパイル警告の解決方法
参考
Null 許容の警告を解決する手法を学ぶ
Null 許容参照型の使用
コード例
- コンストラクタでの代入
public class Person
{
public Person(string first, string last)
{
FirstName = first;
LastName = last;
}
public string FirstName { get; set; }
public string LastName { get; set; }
}
- 既定値が存在する場合は、プロパティ宣言時に既定値を代入
public class Person
{
public string FirstName { get; set; } = "";
public string LastName { get; set; } = "";
}
- null があり得る場合は、Null 許容参照型に変更
public class Person
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
}
- null 免除演算子を使用
public class Person
{
public string FirstName { get; set; } = null!;
public string LastName { get; set; } = null!;
}
- default + null 免除演算子を使用
public class Person
{
public string FirstName { get; set; } = default!;
public string LastName { get; set; } = default!;
}
基本的にはコンストラクタで明示的に代入するように実装すべき。
オブジェクトの初期化時に必須プロパティの設定を強制できる。業務アプリ用のデータを格納するクラスのような場合では、必須(DB で not null な)項目の値をすべて用意してからコンストラクタを使用してインスタンス生成できるケースは少なく、とりあえずインスタンス生成して、そのあとで必須・非必須のプロパティを設定していく、というコードになることが多い。なので、string 型のプロパティについては、宣言時に空文字("")を代入するコードスタイルもありかもしれない。(null がありえるプロパティであれば、もちろん「Null 許容参照型」にしなければならない)
null 免除演算子の使いどころは、プロパティは必須だがクラスのインスタンス生成は外部のライブラリに依存する(自前で初期値を設定できない、DI で入ってくるとか)ケース。
default! と null! は事実上同じだが、プロパティの初期化には default! がよく使われている。