早些时候,IComparable<T>
Jon Skeet 向我提供了一个泛型接口中逆变的具体示例。然而,这又引发了另一个问题。为什么通用List<T>.Sort()
方法不能推断出相同的信息?
我在这里提供了引用的示例作为static Foo<T>()
方法。你会发现这个方法能够推断出T
和调用的类型CompareTo(Circle)
。List<ICircle>.Sort()
另一方面是无法推断T
等调用的类型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;
}
}
}