编译器如何允许转换对象为IComparable?即使对象没有实现接口
本文关键字:对象 接口 实现 IComparable 何允许 转换 编译器 | 更新日期: 2023-09-27 18:12:50
我有点好奇知道编译器如何处理下面的代码,即使对象不实现IComparable Interface。一般来说,如果将接口类型转换为没有实现该接口的对象,编译器将抛出错误。
object i = 6;
object r = ((IComparable)i).CompareTo(5);
Console.WriteLine(r);
对象没有实现IComparable接口,但是这里的强制转换是如何完成的,它不应该说object没有实现IComparable吗?
编辑:Nullable Type(Nullable Type不实现iccomparable)的行为是什么?
int? j = 5;
int result = ((IComparable) j).CompareTo(6);
应该是这样的:
int result = ((IComparable) (int) j).CompareTo(6);
//int implements IComparable
i
是一个int,它实现了IComparable
。无论你如何引用一个对象,它都不会改变它的类型。
编辑:编译器不给你一个错误的原因在这里(它不是有效的,也就是说)是,因为你是铸造一个object
,它不能知道,直到运行时是否cast将工作。
对于Nullable<T>
,它们可以完全转换为其底层类型。
来自MSDN:
盒装空类型完全支持底层类型的功能:
double? d = 44.4;
object iBoxed = d;
// Access IConvertible interface implemented by double.
IConvertible ic = (IConvertible)iBoxed;
int i = ic.ToInt32(null);
string str = ic.ToString();