为什么不'在.net中扩展IEqualityComparer
本文关键字:扩展 IEqualityComparer net 为什么不 | 更新日期: 2023-09-27 18:05:17
在。net中,IEnumerable<T>
扩展IEnumerable
的事实经常派上用场。令人沮丧的是,尽管EqualityComparer<T>
和Comparer<T>
类实现了两个接口,但IEqualityComparer<T>
和IComparer<T>
并没有扩展它们的非泛型对接物。这种差异有什么原因吗?
如果我有一个字符串序列,我可以用它来获得一个对象序列,因为每个字符串也是一个对象。这对任何序列都成立;当给定任何序列时,我总能得到一个对象序列。
如果我有一个可以比较两个字符串的对象,我就不能用它来比较两个对象,因为这两个对象可能不是字符串。
这是因为IEnumerable<T>
是协变的,而IComparer
和IEqualityComparer
不是。(不仅在c#的意义上,尽管这也是正确的,而且在概念计算机科学的意义上。)
至于为什么具体的EqualityComparer<T>
和Comparer
类实现了两个接口,而不仅仅是通用版本,这是一个只能由选择创建这些类型的员工来解释的决定。我想他们这样做是因为当时有足够多的人在使用接口的非泛型版本,他们希望这些类型可以与所有现有的非泛型代码一起使用。