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

时间:2013-02-07 15:00:36

标签: c# data-structures immutability base-class-library immutable-collections

由于不可变数据结构是一等值,我们可以将它们与其他任何值进行相等或顺序比较。但是在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

这种行为会以某种方式得到解决吗?

1 个答案:

答案 0 :(得分:3)

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

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