IComparable不需要逆变吗?

时间:2013-03-20 15:57:54

标签: c# oop interface contravariance icomparable

在下面的代码中,我的目标是.NET 2.0 Framework。

我可以将Programmer(派生)对象传递给期望Person(基类)

的Compare方法

但是,由于程序员是一个人(简单的OO概念),我声称在.NET 4.0中,IComparable接口声明中的'in'关键字是'过度杀伤':)

在我向Microsoft写一封关于他们删除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; }
}

2 个答案:

答案 0 :(得分:6)

协变量和逆变量与您传递给方法的类型无关。它是关于包含方法的通用接口。

使用in以下代码是合法的:

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

没有in,这将是非法的。

答案 1 :(得分:2)

Liskov substitution principle如果IComparer<>实现可以比较Person个实例,那么它可以比较从Person派生的类型的对象。 in关键字允许您使用IComparer<Person>比较器来比较MyPerson类型的对象(派生自Person)。示例用例是一个比较器,它按名称命令Person个实例,以便在SortedList<Person>中使用;其中逆变接口也允许同一个比较器与SortedList<MyPerson>一起使用。