为什么GetType()为Nullable <DateTime>返回DateTime类型

vel*_*koz 15 .net c# nullable .net-4.0 c#-4.0

可能重复:
Nullable类型不是可空类型?

在以下代码中:

DateTime? dt = DateTime.Now;
MessageBox.Show(dt.GetType().ToString());
Run Code Online (Sandbox Code Playgroud)

消息框显示"System.DateTime",而不是Nullable<DateTime>.以下内容也返回false(因为GetType错误):

if (dt.GetType().IsAssignableFrom(typeof(DateTime?))) 
 ...
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,使用DateTime?Nullable<DateTime>没有区别)在监视窗口中,您有"类型"列显示正确的类型(System.DateTime?).

在我的代码中,我引用了dt作为一个object,所以我需要正确地获取底层类型.我怎样才能做到这一点?

dig*_*All 12

引用MSDN(如何:识别可空类型):

在Nullable类型上调用GetType会导致在将类型隐式转换为Object时执行装箱操作.因此,GetType始终返回表示基础类型的Type对象,而不是Nullable类型.

所以基本上你的代码等于:

    DateTime? dt = DateTime.Now;
    object box = (object)dt;
    Console.Write(box.GetType().ToString());
Run Code Online (Sandbox Code Playgroud)

另外,看看MSDN 上的"Boxing Nullable Types",我们读到:

如果对象是非null - 如果HasValue为true - 则发生装箱,但只有可以为空的对象所基于的基础类型被装箱.装箱非null可空值类型框的值类型本身,而不是包装值类型的System.Nullable(Of T).

这清楚地解释了"奇怪"的行为 Nullable<T>.GetType()