我很想知道编译器如何处理以下代码,即使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
答案 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();