int? a = 10;
Type type = a.GetType();
Console.WriteLine(type.Name);

を実行すると、

Int32

って表示されるんだ。

Nullable`1

って表示されるのかと思った。


当然なのだが、

a = null;
type = a.GetType();

だと、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
と、例外が発生する。
そういう意味では、Int32と表示されるのは。理にかなっているのかな?

ローカル変数 int? x が宣言されているときに、オブジェクト x が、nullableかどうかを調べる方法は無いのかな?
まあ、ローカル変数なんだから、それは、明らかに、nullableだってわかるから
そんな場面はないか?

じゃあ、引数でわたってきた場合は、これも同じ理由で nullableってわかる。
引数の型がobject の場合は、実際の型が nullableかどうかを知る手段はないけど、
== null とか聞けばいいんだから、これも無くても困らないような気がする。

結局、nullableかどうかを調べる必要があるのは、クラスのメンバー変数だけかな。
この場合は、リフレクションを使って、FieldInfoを取り出せば、

Type type = fieldInfo.FieldType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<> )) {…}

というコードで判断できる。

ところで、

typeof(Nullable<>)

なんていう書き方が出来るのを最近まで知らなかった。