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<T>(T[] array, Func<T, bool> 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 => n > 10);
Console.WriteLine(found); // 0(int のデフォルト値)default と null の違い
参照型では default と null は同じですが、値型では異なります。
int? nullableInt = null;
int defaultInt = default; // 0
Console.WriteLine(nullableInt == null); // True
Console.WriteLine(defaultInt == 0); // TrueC# 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<T>(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<T>() where T : class
{
return default; // T? として宣言すれば警告なし
}default 演算子は、ジェネリックコードで初期値や「値なし」を表現する際の重要なツールです。