在下面的代码中,我的目标是.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; }
}
答案 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>
一起使用。