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

时间:2011-01-21 13:29:20

标签: c# .net .net-4.0 c#-4.0 nullable

  

可能重复:
  Nullable type is not a nullable type?

在以下代码中:

DateTime? dt = DateTime.Now;
MessageBox.Show(dt.GetType().ToString());

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

if (dt.GetType().IsAssignableFrom(typeof(DateTime?))) 
 ...

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

在我的代码中,我将dt引用为object,因此我需要正确地获取基础类型。我怎么能这样做?

3 个答案:

答案 0 :(得分:11)

引用MSDN (How to: Identify a Nullable Type)

  

在Nullable类型上调用GetType   导致拳击操作   当类型是隐式时执行   转换为Object。因此GetType   总是返回一个Type对象   代表基础类型,而不是   Nullable类型。

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

    DateTime? dt = DateTime.Now;
    object box = (object)dt;
    Console.Write(box.GetType().ToString());

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

  

如果对象是非null - 如果   HasValue是真的 - 然后拳击   发生,但只有基础类型   可以为空的对象基于   盒装。拳击非null可空   值类型框的值类型   本身,而不是System.Nullable(Of T)   包装值类型。

这清楚地解释了Nullable<T>.GetType()

的“奇怪”行为

答案 1 :(得分:3)

GetType()使用反射返回一个类型。要确定它是否为可空类型,您需要检查PropertyType值。

foreach (PropertyInfo pi in dt.GetType().GetProperties())
{
    if(pi.PropertyType == typeof(DateTime?))
    {
       // display nullable info
    }
}

答案 2 :(得分:0)

因为如果你写这样的东西:

DateTime? dt = null;
Type t = dt.GetType();

这是一个NullReferenceException。