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<>)
なんていう書き方が出来るのを最近まで知らなかった。