.NET 中的泛型接口
本文概述了 .NET 的泛型接口,这些接口在泛型类型系列中提供了通用的功能。
泛型接口提供与非泛型接口对应的类型安全接口,用于实现排序比较、相等比较以及泛型集合类型所共享的功能。 .NET 7 为类似数字的类型引入了泛型接口,例如 System.Numerics.INumber<TSelf>。 通过这些接口可定义提供数学功能的泛型方法,其中泛型类型参数被约束为实现泛型数字接口的类型。
注意
多个泛型接口的类型参数标记为协变或逆变,这为分配和使用实现这些接口的类型提供了更好的灵活性。 有关详细信息,请参阅协变和逆变。
相等比较和排序比较
在 System 命名空间中,System.IComparable<T> 和 System.IEquatable<T> 泛型接口与它们对应的非泛型接口一样,各自定义了用于排序比较和相等比较的方法。 类型通过实现这些接口来提供执行这些比较的能力。
在 System.Collections.Generic 命名空间中,IComparer<T> 和 IEqualityComparer<T> 泛型接口为没有实现 System.IComparable<T> 或 System.IEquatable<T> 接口的类型提供了一种定义排序比较和相等比较的方式。 对于实现了这些接口的类型,它们还提供了一种方式来重新定义它们的关系。
这些接口由许多泛型集合类的方法和构造函数使用。 例如,可以将泛型 IComparer<T> 对象传递至 SortedDictionary<TKey,TValue> 类的构造函数,以便为没有实现泛型 System.IComparable<T> 的类型指定排列顺序。 存在 Array.Sort 泛型静态方法与通过泛型 IComparer<T> 实现对数组和列表进行排序的 List<T>.Sort 实例方法的重载。
Comparer<T> 和 EqualityComparer<T> 泛型类为 IComparer<T> 和 IEqualityComparer<T> 泛型接口的实现提供基类,同时还通过其各自的 Comparer<T>.Default 和 EqualityComparer<T>.Default 属性提供默认排序比较和相等性比较。
集合功能
ICollection<T> 泛型接口是泛型集合类型的基本接口。 它提供添加、删除、复制和枚举元素的基本功能。 ICollection<T> 继承自泛型 IEnumerable<T> 和非泛型 IEnumerable。
IList<T> 泛型接口使用索引检索的方法扩展 ICollection<T> 泛型接口。
IDictionary<TKey,TValue> 泛型接口使用键控检索的方法扩展 ICollection<T> 泛型接口。 .NET 基类库中的泛型字典类型还实现非泛型 IDictionary 接口。
IEnumerable<T> 泛型接口提供泛型枚举器结构。 泛型枚举器实现的 IEnumerator<T> 泛型接口继承自非泛型 IEnumerator 接口;MoveNext 和 Reset 成员(不依赖于类型参数
T
)仅出现在非泛型接口中。 这意味着非泛型接口的任何使用者还可以使用泛型接口。
数学功能
.NET 7 在 System.Numerics 命名空间中引入了泛型接口,用于描述类似数字的类型及其可用的功能。 .NET 基类库提供的 20 种数字类型(例如 Int32 和 Double)已更新以实现这些接口。 这些接口中最突出的是 INumber<TSelf>,它大致对应于一个“真实”数字。
有关这些接口的详细信息,请参阅泛型数学。