Home / ぼやきごと / 2015-02-15
2015-02-15

C#:ジェネリック型が null 許容型であるか判別する

ある型が null 許容型(Nullable<>)であるか否か判別する方法がMSDNで紹介されています。

これを使うと、ジェネリック型 T が null 許容型であるか否か判別するメソッドは次のように書けます。

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
-
!
-
|
|
|
!
// 型 T が null 許容型であるか否かを取得する。
public static bool IsNullable<T>()
{
    return (
        typeof(T).IsGenericType &&
        typeof(T).GetGenericTypeDefinition() == typeof(Nullable<>));
}

理屈はわかりますがちょっと長ったらしいですね。

ところで、C#のジェネリックには default キーワードがあります。

ジェネリック型 T がクラス型または null 許容型である場合、 default(T)null になります。
Nullable<> は値型なので、型 T が値型であり default(T)null であればそれは null 許容型ということになります。

というわけで、上述のメソッドは次のようにも書けます。

すべて開くすべて閉じる
  1
  2
  3
  4
  5
-
!
-
|
!
// 型 T が null 許容型であるか否かを取得する。
public static bool IsNullable<T>()
{
    return (typeof(T).IsValueType && default(T) == null);
}

かなりスッキリしました。

型自体ではなく System.Type オブジェクトしかない場合にはこの方法は使えないため、MSDNの方法が不要というわけではありません。

Category: [C#][プログラミング] - 2015-02-15 22:53:43