3

.NETでは、IEnumerable<T>拡張するという事実IEnumerableが役立つことがよくあります。イライラすることに、とクラスが両方のインターフェースを実装しているという事実にもかかわらず、ジェネリックではない対応物を拡張していませんIEqualityComparer<T>。この不一致の理由はありますか?IComparer<T>EqualityComparer<T>Comparer<T>

4

1 に答える 1

0

文字列のシーケンスがある場合、それを使用してオブジェクトのシーケンスを取得できます。これは、各文字列もオブジェクトであるためです。これはどのシーケンスにも当てはまります。任意のシーケンスを指定すると、常にオブジェクトのシーケンスを取得できます。

2 つの文字列を比較できるオブジェクトがある場合、それを使用して 2 つのオブジェクトを比較することはできません。これらの 2 つのオブジェクトは文字列ではない可能性があるからです。

この理由は、IEnumerable<T>が共変であるのに対し、IComparerIEqualityComparerが共変でないためです。(C# の意味だけでなく、それは事実ですが、概念的なコンピューター サイエンスの意味でもあります。)

ジェネリック バージョンだけでなく、具象EqualityComparer<T>とクラスが両方のインターフェイスを実装する理由については、それらの型を作成することを選択した従業員によってのみ実際に説明できる決定です。Comparer当時、十分な数の人々がインターフェイスの非ジェネリック バージョンを使用していたため、既存のすべての非ジェネリック コードで型を使用できるようにしたかったためだと思います。

于 2013-03-22T18:41:15.507 に答える