рассмотрим следующую базовую схему классов:
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);
}
}
, а затем использовать их следующим образом:
List<Base> thingies = new List<Base>
{
new Base(),
new Derived(),
new Derived()
};
thingies.Sort(new BaseComparer());
Я ожидал, что Comparer вызовет метод Derived.CompareTo в тех ситуациях, когда его параметры x и y являются производными экземплярами.
Однако это не тот случай, и вместо этого вызывается Base.CompareTo, и я продолжаю задаваться вопросом, почему. Кажется, я не могу вывести это поведение из моего базового понимания правил разрешения перегрузки, как описано в спецификации языка C #.
Может кто-нибудь пролить свет на это для меня?