C# default 演算子と default(T)

ジェネリクスで型パラメータ T のデフォルト値を取得するには default 演算子を使います。参照型なら null、値型ならゼロ相当の値が返ります。

default 演算子の基本

default(T) または単に default で、型 T のデフォルト値を取得できます。

public T GetDefaultValue<T>()
{
    return default(T)!; // または return default!;
}

Console.WriteLine(GetDefaultValue<int>());      // 0
Console.WriteLine(GetDefaultValue<bool>());     // False
Console.WriteLine(GetDefaultValue<string>());   // (null)
Console.WriteLine(GetDefaultValue<DateTime>()); // 0001/01/01 0:00:00

型ごとのデフォルト値

数値型(int, double など)

0 または 0.0

bool 型

false

参照型(class)

null

構造体(struct)

すべてのフィールドがデフォルト値の状態

Nullable<T>

null

ジェネリックメソッドでの活用

要素が見つからない場合にデフォルト値を返すメソッドでよく使われます。

public static T FindOrDefault&lt;T&gt;(T[] array, Func&lt;T, bool&gt; predicate)
{
    foreach (var item in array)
    {
        if (predicate(item))
            return item;
    }
    return default!; // 見つからなければデフォルト値
}
var numbers = new[] { 1, 2, 3, 4, 5 };

int found = FindOrDefault(numbers, n =&gt; n &gt; 10);
Console.WriteLine(found); // 0(int のデフォルト値)

default と null の違い

参照型では defaultnull は同じですが、値型では異なります。

int? nullableInt = null;
int defaultInt = default; // 0

Console.WriteLine(nullableInt == null);  // True
Console.WriteLine(defaultInt == 0);      // True

C# 7.1 以降の省略記法

C# 7.1 以降では、型が推論できる場合は default(T)(T) を省略できます。

// C# 7.0 以前
int value1 = default(int);
string text1 = default(string);

// C# 7.1 以降
int value2 = default;
string text2 = default;

制約と組み合わせた使用

new() 制約がある場合は new T() でインスタンスを生成できますが、ない場合は default を使います。

new() 制約あり

new T() でインスタンス生成が可能

制約なし

default(T) でデフォルト値のみ取得可能

public T CreateOrDefault&lt;T&gt;(bool create) where T : new()
{
    if (create)
        return new T();    // new() 制約があるから可能
    return default!;       // default は常に使える
}

null 許容参照型との関係

C# 8.0 以降の null 許容参照型を有効にしている場合、default は null を返すため警告が出ることがあります。!(null 免除演算子)や適切な null チェックで対処します。

#nullable enable

public T? GetDefault&lt;T&gt;() where T : class
{
    return default; // T? として宣言すれば警告なし
}

default 演算子は、ジェネリックコードで初期値や「値なし」を表現する際の重要なツールです。