在 .NET 中,IEnumerable<T>
延伸IEnumerable
经常派上用场。令人沮丧的是IEqualityComparer<T>
和 IComparer<T>
不要扩展它们的非通用对应物,尽管 EqualityComparer<T>
和 Comparer<T>
类实现这两个接口(interface)。这种差异有什么原因吗?
最佳答案
如果我有一个字符串序列,我可以用它来获得一个对象序列,因为每个字符串也是一个对象。任何序列都是如此;当给定任何序列时,我总能得到一个对象序列。
如果我有一个可以比较两个字符串的对象,我不能用它来比较两个对象,因为这两个对象可能不是字符串。
之所以这样是因为IEnumerable<T>
是协变的,而 IComparer
和 IEqualityComparer
不是。 (不仅在 C# 意义上,虽然这也是正确的,而且在概念计算机科学意义上也是如此。)
至于为什么具体EqualityComparer<T>
和 Comparer
类实现两个接口(interface),而不仅仅是通用版本,这个决定只能由选择创建这些类型的员工真正解释。我想他们这样做是因为当时有足够多的人在使用接口(interface)的非泛型版本,他们希望这些类型可用于所有现有的非泛型代码。
关于c# - 为什么 IEqualityComparer<T> 不在 .NET 中扩展 IEqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577585/