blf*_*blf 3 c# sorting contravariance compareto
早些时候,我在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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
该列表是一个列表ICircle,而不是列表Circle. ICircle没有实现IComparable<Circle>或IComparable<ICircle>(或任何其他IComparable接口.您放入列表中的所有项目都碰巧实现IComparer<Circle>并且是Circles,但您可以轻松地将项目放入实现中ICircle并且根本不实现任何IComparable接口.
Foo另一方面,将a IComparable<T>作为参数,因此您知道它实现了IComparable<T>.