编译器如何允许转换对象为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

编译器如何允许转换对象为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();