IComparable<T>
以前、 Jon Skeetからジェネリック インターフェイスの反変性の具体例を提供されました。しかし、これはさらに別の疑問を引き起こしました。List<T>.Sort()
ジェネリックメソッドが同じ情報を推測できないのはなぜですか?
ここで参照されている例をstatic Foo<T>()
メソッドとして提供しました。このメソッドが と の型を推測できることがわかりT
ますCompareTo(Circle)
。List<ICircle>.Sort()
一方、T
and so 呼び出しの型を推測することはできませんCompareTo(Object)
。
using System;
using System.Collections.Generic;
namespace Testable
{
public class Test
{
public static void Main()
{
List<ICircle> circles = new List<ICircle>();
circles.Add(new Circle());
circles.Add(new Circle());
circles.Sort();
Foo(new Circle(), new Circle());
}
public static void Foo<T>(IComparable<T> a, T b) where T : ICircle
{
a.CompareTo(b);
}
}
public interface ICircle
{
}
public class Circle :
IComparable, IComparable<Circle>, ICircle
{
public Int32 CompareTo(Object other)
{
Console.WriteLine("Called CompareTo(Object)");
return 0;
}
public Int32 CompareTo(Circle other)
{
Console.WriteLine("Called CompareTo(Circle)");
return 0;
}
}
}