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; }
}
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>
使用相同的比较器。