在.NET中,IEnumerable<T>
扩展IEnumerable
的事实经常派上用场。令人沮丧的是,尽管IEqualityComparer<T>
和IComparer<T>
类实现了两个接口,但EqualityComparer<T>
和Comparer<T>
并没有扩展它们的非通用对应物。这种差异是否有原因?
答案 0 :(得分:0)
如果我有一系列字符串,我可以用它来获取一系列对象,因为每个字符串也是一个对象。任何序列都是如此;给定任何序列时,我总能获得一系列对象。
如果我有一个可以比较两个字符串的对象,我就不能用它来比较两个对象,因为这两个对象可能不是字符串。
原因是IEnumerable<T>
是协变的,而IComparer
和IEqualityComparer
不是。 (不仅仅是在C#意义上,虽然这也是正确的,但也在概念计算机科学意义上。)
至于为什么具体的EqualityComparer<T>
和Comparer
类实现两个接口而不仅仅是通用版本,这个决定只能由选择创建这些类型的员工来解释。我想他们是这样做的,因为当时有足够多的人使用非通用版本的接口,他们希望这些类型可以与所有现有的非通用代码一起使用。