【问题标题】:How does Compiler allows Cast to Object for IComparable?Even if Object Does not Implement the Interface?Compiler如何允许Cast to Object for IComparable?即使Object没有实现接口?
【发布时间】:2014-07-12 19:27:11
【问题描述】:

我有点想知道编译器如何处理以下代码,即使 Object 没有实现 IComparable 接口。 一般来说,如果我们将一个接口类型转换为一个没有实现该接口的对象,编译器会抛出一个错误。

    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

【问题讨论】:

    标签: c# compiler-construction


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-23
      • 2011-05-10
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多