2

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

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

但是由于程序员是人(简单的 OO 概念),我声称在 .NET 4.0 中,IComparable 接口声明中的“in”关键字是“矫枉过正”:)

在我给微软写一封关于他们删除 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; }
}
4

2 回答 2

6

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

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

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

没有in它将是非法的。

于 2013-03-20T16:01:03.010 回答
2

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

于 2013-03-20T16:03:53.397 回答