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