为什么IEqualityComparer <t>不在.NET中扩展IEqualityComparer </t>

时间:2013-03-22 18:38:48

标签: c# generics iequalitycomparer

在.NET中,IEnumerable<T>扩展IEnumerable的事实经常派上用场。令人沮丧的是,尽管IEqualityComparer<T>IComparer<T>类实现了两个接口,但EqualityComparer<T>Comparer<T>并没有扩展它们的非通用对应物。这种差异是否有原因?

1 个答案:

答案 0 :(得分:0)

如果我有一系列字符串,我可以用它来获取一系列对象,因为每个字符串也是一个对象。任何序列都是如此;给定任何序列时,我总能获得一系列对象。

如果我有一个可以比较两个字符串的对象,我就不能用它来比较两个对象,因为这两个对象可能不是字符串。

原因是IEnumerable<T>是协变的,而IComparerIEqualityComparer不是。 (不仅仅是在C#意义上,虽然这也是正确的,但也在概念计算机科学意义上。)

至于为什么具体的EqualityComparer<T>Comparer类实现两个接口而不仅仅是通用版本,这个决定只能由选择创建这些类型的员工来解释。我想他们是这样做的,因为当时有足够多的人使用非通用版本的接口,他们希望这些类型可以与所有现有的非通用代码一起使用。