反変性に関するmsdnページで、「IComparerでの反変性の利点」を示す非常に興味深い例を見つけました
まず、かなり奇妙な基本クラスと派生クラスを使用します。
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Employee : Person { }
私はすでに、その悪い例は、クラスが少なくとも独自のものを少し追加せずに基本クラスを継承することは決してないと言うことができます.
次に、単純な IEqualityComparer クラスを作成します。
class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
..
}
public int GetHashCode(Person person)
{
..
}
}
次に、問題の例が続きます。
List<Employee> employees = new List<Employee> {
new Employee() {FirstName = "Michael", LastName = "Alexander"},
new Employee() {FirstName = "Jeff", LastName = "Price"}
};
IEnumerable<Employee> noduplicates =
employees.Distinct<Employee>(new PersonComparer());
今私の質問 - まず第一に、この場合 Employee は不要なクラスです。実際には単なる人物クラスであるため、この状況で PersonComparer を使用できるのは事実です!
ただし、現実の世界Employee
では、少なくとも 1 つの新しいフィールドがありますJobTitle
。異なる従業員が必要な場合、比較のためにその JobTitle フィールドを考慮する必要があることは明らかであり、人の比較者などの反変比較者はその仕事に適していないことは明らかであるため、新しいメンバーを知ることができないためです。従業員が定義しました。
もちろん、非常に奇妙な機能であっても、状況によっては非論理的であっても、どの言語機能でも使用できますが、この場合、デフォルトの動作であるほど頻繁には役に立たないと思います。実際、型の安全性を少し壊しているように見えます。メソッドが Employee 比較子を期待している場合、実際には人またはオブジェクト比較子を入れることができ、問題なくコンパイルされます。デフォルトのシナリオが Employee をオブジェクトまたは基本的な Person のように扱うことになるとは想像しがたいですが。
それで、それらのインターフェースのデフォルトの反変性は本当に良いのでしょうか?
編集:反分散と共分散とは何かを理解しています。これらの比較インターフェースがデフォルトで反変になるように変更された理由を尋ねています。