【发布时间】:2017-02-18 17:32:57
【问题描述】:
以下 C# 调用返回 false :
typeof(IComparable).IsAssignableFrom(typeof(DateTime?))
但是,以下行是完全有效的:
IComparable comparable = (DateTime?)DateTime.Now;
为什么会这样?
是不是因为可空类型是使用Nullable<T> 支持的,而第一个泛型参数实现了一个接口这一事实并不意味着 Nullable 类也实现了该接口? (例如:List<Foo> 没有实现 Foo 实现的接口)
编辑: 我认为上面的行可以编译,因为当装箱一个可为空的类型时,只有底层类型被装箱,如下所述:https://msdn.microsoft.com/en-us/library/ms228597.aspx
【问题讨论】:
-
有趣的问题是为什么即使
Nullable<T>没有实现IComparable,你的第二行也会编译 -
我应该重写这个问题。
-
您提供的链接已经很好地解释了它,甚至显示了一个可以分配给
IConvertible的可空示例。所以原因是,如果一个 nullable 有一个值,它将被装箱到底层类型T,而不是 nullable。