Skip to content

Null許容参照型の警告「Non-nullable property must contain a non-null value」の解決方法

問題の概要

C#でクラスを定義する際、以下のような警告が表示されることがあります:

警告 CS8618: Null 非許容プロパティ 'From' はコンストラクタの終了時に null 以外の値を含まなければなりません。プロパティを Null 許容として宣言することを検討してください

この警告は、プロパティが非null型として宣言されているにもかかわらず、コンストラクタで初期化されていない場合に発生します。

csharp
public class Greeting
{
    public string From { get; set; }  // 警告が発生
    public string To { get; set; }    // 警告が発生
    public string Message { get; set; }  // 警告が発生
}

原因

この警告は、C# 8.0で導入されたNull許容参照型機能が有効になっている場合に表示されます。この機能により、参照型はデフォルトで非nullとして扱われ、null値の可能性がある場合は明示的に宣言する必要があります。

解決方法

方法1: プロパティをNull許容として宣言

プロパティがnullになる可能性がある場合、?を使用して明示的に宣言します:

csharp
public class Greeting
{
    public string? From { get; set; }
    public string? To { get; set; }
    public string? Message { get; set; }
}

方法2: デフォルト値を設定

プロパティが常にnull以外の値を持つ場合、デフォルト値を設定します:

csharp
public class Greeting
{
    public string From { get; set; } = string.Empty;
    public string To { get; set; } = string.Empty;
    public string Message { get; set; } = string.Empty;
}

方法3: コンストラクタで初期化

コンストラクタを使用してすべてのプロパティを初期化します:

csharp
public class Greeting
{
    public string From { get; set; }
    public string To { get; set; }
    public string Message { get; set; }
    
    public Greeting(string from, string to, string message)
    {
        From = from;
        To = to;
        Message = message;
    }
}

方法4: required修飾子を使用 (C# 11以降)

C# 11で導入されたrequired修飾子を使用すると、オブジェクト初期化子での初期化を強制できます:

csharp
public class Greeting
{
    public required string From { get; set; }
    public required string To { get; set; }
    public required string Message { get; set; }
}

// 使用例
var greeting = new Greeting()
{
    From = "Me",
    To = "You",
    Message = "Hello!"
};

方法5: null免除演算子を使用

プロパティが後で確実に初期化されることをコンパイラに伝えるために、null免除演算子!を使用します:

csharp
public class Greeting
{
    public string From { get; set; } = null!;
    public string To { get; set; } = null!;
    public string Message { get; set; } = null!;
}

WARNING

null免除演算子は注意して使用してください。実際にnullになる可能性がある場合は、適切なnullチェックを実装する必要があります。

方法6: 属性を使用した制御

AllowNullMaybeNull属性を使用して、null値の扱いを明示できます:

csharp
using System.Diagnostics.CodeAnalysis;

public class Greeting
{
    [AllowNull]
    public string From { get; set; }
    
    [MaybeNull]
    public string To { get; set; }
    
    public string Message { get; set; } = string.Empty;
}

方法7: 警告の無効化(非推奨)

警告を完全に無効化することも可能ですが、これは推奨されません:

csharp
#nullable disable

public class Greeting
{
    public string From { get; set; }
    public string To { get; set; }
    public string Message { get; set; }
}

または、プロジェクトファイルでNull許容参照型を無効化:

xml
<PropertyGroup>
    <Nullable>disable</Nullable>
</PropertyGroup>

警告

Null許容参照型機能を無効にすると、潜在的なnull参照例外を見逃す可能性があります。可能な限り、適切な初期化を行うことを推奨します。

エンティティフレームワークでの対応

Entity Frameworkを使用する場合、データベースのNULL制約とコードのNull許容性を一致させる必要があります:

csharp
public class User
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty; // NOT NULL列に対応
    public string? Description { get; set; } // NULL許容列に対応
}

ベストプラクティス

  1. 意図を明確に: プロパティがnullになる可能性があるかどうかを明確に宣言する
  2. 早期初期化: 可能な限りコンストラクタまたはプロパティ初期化子で初期化する
  3. null免除演算子の慎重な使用: 本当に安全な場合のみ使用する
  4. 一貫性の維持: プロジェクト全体で一貫したNull許容性のポリシーを適用する

まとめ

Null許容参照型の警告は、コードの安全性を高めるための重要な機能です。適切に対処することで、実行時のnull参照例外を防ぎ、より堅牢なコードを書くことができます。プロパティの用途に応じて、最適な初期化方法を選択してください。