编译器如何允许Cast to Object用于IComparable?即使Object没有实现接口?

时间:2014-07-12 19:27:12

标签: c# compiler-construction

我很想知道编译器如何处理以下代码,即使Object没有实现IComparable接口。 通常,如果我们将一个接口转换为未实现该接口的对象,则Compiler将抛出一个错误。

    object i = 6;
    object r = ((IComparable)i).CompareTo(5);
    Console.WriteLine(r);

该对象没有实现IComparable接口,但如果没有说Object不实现IComparable,那么如何在这里完成转换?

编辑:Nullable类型的行为是什么(Nullable类型不实现IComparable)?

int? j = 5;
int result = ((IComparable) j).CompareTo(6); 

不应该是这样的:

   int result = ((IComparable) (int) j).CompareTo(6);
//int implements IComparable

2 个答案:

答案 0 :(得分:4)

i是一个int,它实现了IComparable。无论您如何引用对象,对象都不会更改其类型。

编辑:编译器没有在这里给你一个错误的原因(如果它没有用,那就是),因为你正在转换object,它直到运行时才能知道转换是否会工作

答案 1 :(得分:0)

关于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();