IComparable不需要逆变吗?

Her*_*art 2 c# oop interface icomparable contravariance

在下面的代码中,我的目标是.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; }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 6

共同和逆变不是关于你传递给方法的类型.它是关于包含方法的通用接口.

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

IComparable<Person> foo = ...;
IComparable<Programmer> bar = foo;
Run Code Online (Sandbox Code Playgroud)

没有in它将是非法的.