C#中的以下调用返回false:

typeof(IComparable).IsAssignableFrom(typeof(DateTime?))

但是,以下行是完全有效的:
IComparable comparable = (DateTime?)DateTime.Now;

为什么会这样呢?

是因为可空类型是使用Nullable<T>支持的,并且第一个泛型参数实现了接口(interface)这一事实并不意味着Nullable类也实现了该接口(interface)? (例如:List<Foo>不实现Foo实现的接口(interface))

编辑 :
我认为上面的行可以编译,因为在装箱可空类型时,仅将基础类型装箱,如下所述:https://msdn.microsoft.com/en-us/library/ms228597.aspx

最佳答案

出现这种现象的原因是IsAssignableFrom()没有考虑编译器为可空类型的转换而发出的特殊装箱转换。

请注意,您实际上不需要问题中的类型转换。

代替

 IComparable comparable = (DateTime?)DateTime.Now;

你可以写:
DateTime? test = DateTime.Now;
IComparable comparable = test;

编译这些行的第一行是因为Nullable<T>提供了一个隐式转换运算符:
public static implicit operator Nullable<T> (
    T value
)

第二行使编译器发出box指令:
L_000e: box [mscorlib]System.Nullable`1<valuetype [mscorlib]System.DateTime>

此装箱操作包含在C#语言规范的6.1.7节装箱转换(具体包括可空类型的装箱转换)中,其中指出:



这就是引起上述拳击操作的原因。我已将最相关的部分加粗并用斜体显示。

另请参见此链接(由OP提供):https://msdn.microsoft.com/en-us/library/ms228597.aspx

09-25 20:56