次の基本的なクラス レイアウトを検討してください。
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());
x パラメーターと y パラメーターの両方が Derived インスタンスである状況では、Comparer が Derived.CompareTo メソッドを呼び出すことを期待していました。
ただし、これは当てはまらず、代わりに Base.CompareTo が呼び出され、なぜなのか疑問に思っています。C# 言語仕様で説明されているように、オーバーロードの解決規則に関する私の基本的な理解では、この動作を差し引くことはできないようです。
誰かが私のためにこれに光を当てることができますか?