IComparable不需要是逆变的

本文关键字:不需要 IComparable | 更新日期: 2023-09-27 18:05:09

在下面的代码中,我的目标是。net 2.0框架。

我可以传递一个Programmer(派生)对象给需要Person(基类)的Compare方法

但由于程序员是一个人(简单的OO概念),我声称在。net 4.0中,IComparable接口声明中的'in'关键字是'overkill':)

在我给微软写一封关于他们删除in关键字的邮件之前,请试着说服我:)

class Program
{
    static void Main(string[] args)
    {
        var person = new Person();
        var test = person.CompareTo(new Programmer());
    }
}
internal class Person : IComparable<Person>
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CompareTo(Person other)
    {
        return this.Id - other.Id;
    }
}
class Programmer : Person
{
    public string ProgrammingLanguage { get; set; }
}

IComparable不需要是逆变的

Co- and -逆变性与传递给方法的类型无关。它是关于包含方法的泛型接口。

对于in,以下代码是合法的:

IComparable<Person> foo = ...;
IComparable<Programmer> bar = foo;

没有in是非法的

根据Liskov替换原则,如果IComparer<>实现可以比较Person实例,那么它也可以比较从Person派生的类型的对象。in关键字允许您使用IComparer<Person>比较器来比较类型为MyPerson(从Person派生)的对象。一个示例用例是比较器,它按名称排序Person实例,以便在SortedList<Person>中使用;其中逆变接口还允许与SortedList<MyPerson>使用相同的比较器。