2

以下のコードでは、.NET 2.0 Framework をターゲットにしています。

Person (基本クラス) を期待する Compare メソッドに Programmer (派生) オブジェクトを渡すことができます。

しかし、プログラマーは人であるため (単純なオブジェクト指向の概念)、.NET 4.0 では、IComparable インターフェイス宣言の「in」キーワードは「やり過ぎ」であると主張します:)

in キーワードを削除することについて Microsoft にメールを書く前に、別の方法で私を納得させてください :)

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インスタンスを比較できる場合、 から派生した型のオブジェクトを比較できますPerson。このinキーワードを使用すると、比較子を使用して(から派生した)IComparer<Person>タイプのオブジェクトを比較できます。ユース ケースの例として、インスタンスを名前で並べ替えて;で使用する比較子があります。ここで、反変インターフェイスにより、同じ比較子を で使用することもできます。MyPersonPersonPersonSortedList<Person>SortedList<MyPerson>

于 2013-03-20T16:03:53.397 に答える