BCL不可变集合:相等是非对称的

本文关键字:非对称 不可变 集合 BCL | 更新日期: 2023-09-27 17:58:06

由于不可变数据结构是一流的值,我们可以像与任何其他值一样,对它们进行相等或有序的比较。但在BCL不可变集合预览中,情况变得复杂起来,因为每个不可变集合都可以通过IEqualityComparer<T>/IComparer<T>实例进行参数化。看起来不应该允许具有不同比较器的不可变集合进行比较(因为没有为比较器本身定义相等),因为这会使相等关系不对称:

var xs = ImmutableList<string>.Empty.Add("AAA")
  .WithComparer(StringComparer.OrdinalIgnoreCase);
var ys = ImmutableList<string>.Empty.Add("aaa")
  .WithComparer(StringComparer.Ordinal);
Console.WriteLine(xs.Equals(ys)); // true
Console.WriteLine(ys.Equals(xs)); // false

这种行为会以某种方式得到纠正吗?

BCL不可变集合:相等是非对称的

平等是一件很难定义的事情,在一群聪明的工程师中更难就这个定义达成共识。:)实际上,我们将从不可变集合的EqualsGetHashCode方法中删除值相等,以便这些方法提供与BCL和客户代码中的大多数其他类型相同的速度(几乎无用)。

我们非常希望在未来的版本中为不可变集合添加值相等方法。