[C#] Null許容型配列を普通の配列に変換する方法(Nullable[]をT[]に変換)


はじめに

Null許容型の配列を通常の配列に変換する方法の備忘録です。

Null許容型の配列とは、基本的に普通の配列の中には「null」を挿入することができせんが、このnullも値の一つとしてみなし配列の値として扱うことができます。

int? a = null;
int b = 100;

int?[] nullableArr = new int?[] { a, b };

foreach(var item in nullableArr)
{
    if(item == null)
    {
        Console.WriteLine("Target item is null");
    }
    else
    {
        Console.WriteLine($"Target item is {item}");
    }
}

上記の通り、配列に「null」を設定しています。
結果は下記の通りです。

Target item is null
Target item is 100

int?[]の型宣言をint[] にすると、a=nullのためエラーとなります。

Null許容型配列を普通の配列に変換する

では、Null許容型の配列に対して、nullの場合はDefault値に置き換えて普通の配列にする方法です。

下記1行を用意してConvertAllにて変換します。

public static T[] Convert<T>(T?[] array) where T : struct => Array.ConvertAll(array, t => t.GetValueOrDefault());

使い方は下記のような感じです。

static void Main(string[] args)
{
    int? a = null;
    int b = 100;

    int?[] nullableArr = new int?[] { a, b };
    Console.WriteLine(nullableArr.GetType());

    var convertedArr = Array.ConvertAll((int?[])nullableArr, x => x ?? default(int));
    Console.WriteLine(convertedArr.GetType());

    foreach (var item in convertedArr)
    {
        Console.WriteLine($"Target item is {item}");
    }
}

上記を実行した結果、想定通りNullable配列を普通の配列に変換されました。その際、nullには代わりに「0」を代入しています。(GetValueOrDefaultのintに対するデフォルト値は0)

System.Nullable`1[System.Int32][]
System.Int32[]
Target item is 0    //<--- nullが0に置き換わっています 
Target item is 100

最後に

結構Nullableのまま利用していることの方が多いですが、nullチェックを省くなどできるだけ分岐点を増やさないコーディングにするのも保守性を考えると良いかと思います。