Comparer中的方法解析

Ant*_*ton 1 c# overloading derived

考虑以下基本类布局:

public class Base : IComparable<Base>
{
  public int CompareTo(Base other)
  {
    //Do comparison
  }
}

public class Derived : Base, IComparable<Derived>
{
  public int CompareTo(Derived other)
  {
    //Do comparison
  }  
}

public class BaseComparer : IComparer<Base>
{
  public int Compare(Base x, Base y)
  {
   return x.CompareTo(y);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用如下:

List<Base> thingies = new List<Base>
{
  new Base(),
  new Derived(),
  new Derived()
};

thingies.Sort(new BaseComparer());
Run Code Online (Sandbox Code Playgroud)

我期待Comparer在其x和y参数都是Derived实例的情况下调用Derived.CompareTo方法.

但是,事实并非如此,而是调用了Base.CompareTo,我一直在想为什么.我似乎无法通过对C#语言规范中描述的重载决策规则的基本理解来推断这种行为.

有人可以为我阐明这一点吗?

Kon*_*lph 5

Base什么都不知道它的派生类 - 所以在Base那里只有一个 CompareTo方法,并且无条件地调用.

重点是在编译时发生重载解析,其中没有关于Base可用的实际引用类型的信息.您需要覆盖该方法Derived,而不是重载它:

public class Derived : Base
{
  public override int CompareTo(Base other)
  {
    //Do comparison
  }  
}
Run Code Online (Sandbox Code Playgroud)

另外标记Base.CompareTo方法virtual.

请注意,这不再实现IComparable<Derived>.您也可以这样做,但出于与您无关的目的.