由于不可变数据结构是一等值,我们可以将它们与其他任何值进行相等或顺序比较。但是在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
这种行为会以某种方式得到解决吗?
答案 0 :(得分:3)
平等是一个难以定义的事情,甚至更难以在智能工程师的房间内就该定义达成共识。 :)
我们实际上将从不可变集合的Equals
和GetHashCode
方法中删除值 - 相等性,以便这些方法提供相同的速度(并且几乎无用) BCL和客户代码中的大多数其他类型。
我们非常希望在将来的版本中为不可变集合添加值相等方法。