Null許容型はGetTypeでNullableを返さず値型を返す

Null許容型ですが、GetTypeメソッドを呼び出した際にNullableではなく値型を返すという特性があります。NullableのGetTypeはintを、NullableのGetTypeはDateTimeという風に。


Nullableを導入した際の値型との互換性のためだと思いますが、ちょっと変わった動作です。そのためだと思いますが、Nullableをdynamic型に代入するとHasValueプロパティが使えなくなります。dynamic型は内部でGetTypeを実行して型情報を取得しているためだと考えられます。


ちなみにNullableなどをプロパティとして持つクラスに対してリフレクションでプロパティを取得し、PropertyTypeで型情報を取るとNullableが取得できます。問題があるのは、実行時のNull許容型の値からGetTypeする場合です。



Nullableの動作を確認するコード


using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

Nullable hoge = 0;

System.Diagnostics.Debug.WriteLine(hoge.GetType().ToString());
System.Diagnostics.Debug.WriteLine(typeof(Nullable).ToString());

dynamic dhoge = hoge;
System.Diagnostics.Debug.WriteLine(dhoge.HasValue.ToString());

}
}
}