c# - 为什么 IEqualityComparer<T> 不在 .NET 中扩展 IEqualityComparer

标签 c# generics iequalitycomparer

在 .NET 中,IEnumerable<T>延伸IEnumerable经常派上用场。令人沮丧的是IEqualityComparer<T>IComparer<T>不要扩展它们的非通用对应物,尽管 EqualityComparer<T>Comparer<T>类实现这两个接口(interface)。这种差异有什么原因吗?

最佳答案

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

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

之所以这样是因为IEnumerable<T>是协变的,而 IComparerIEqualityComparer不是。 (不仅在 C# 意义上,虽然这也是正确的,而且在概念计算机科学意义上也是如此。)

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

关于c# - 为什么 IEqualityComparer<T> 不在 .NET 中扩展 IEqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577585/

相关文章:

c# - 为什么在 Debug模式下会得到随机数?

Java泛型方法

c# - IEqualityComparer<T> 自定义实现和集合操作

c# - 使用具有公差的 IEqualityComparer GetHashCode

java - 使用枚举参数自动推断返回类型

c# - 使用基类 IEqualityComparer 执行 Distinct(),并且仍然返回子类类型?

c# - .net core 2.0 Entity Framework 无限嵌套实体

c# - 从 XML 元素中读取空格字符

c# - 无法从 Windows 窗体应用程序中的 app.config 连接到本地 SQL 数据库

Swift 泛型与任何泛型