2011-01-21 90 views
14

可能重复:
Nullable type is not a nullable type?为什么的GetType()返回DateTime类型为可空<DateTime>

在以下代码:

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

消息框中显示“系统.DateTime“,而不是Nullable<DateTime>。下面的方式也返回false(因为对GetType是错误的):

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

(顺便说一句,使用DateTime?Nullable<DateTime>不会有所作为) 在监视窗口中,你有“类型”一栏多数民众赞成显示正确的类型(System.DateTime?)。

在我的代码中,我将dt引用为object,所以我需要正确地使用基础类型。我怎样才能做到这一点?

+0

重复http://stackoverflow.com/questions/785358/nullable-type-is-not-a-nullable-type的“怪异”的行为似乎有一个很好的答案 – Chris 2011-01-21 13:41:00

+0

请参阅http://msdn.microsoft。com/en-us/library/ms366789(v = VS.100).aspx的一些信息,但不是解决方案 – 2011-01-21 13:46:36

回答

11

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

上的空类型 调用的GetType使装箱操作是 当类型是隐式 转换为对象进行的。因此GetType 总是返回一个Type对象,该对象表示 表示基础类型,而不是 的Nullable类型。

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

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

此外,在MSDN看着"Boxing Nullable Types"我们读到:

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

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

0

因为如果你写的是这样的:

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

这是一个NullReferenceException。

3

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

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