con*_*low 5 c# immutability base-class-library data-structures 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
Run Code Online (Sandbox Code Playgroud)
这种行为会以某种方式修复吗?
平等是一件很难定义的事情,更难在聪明的工程师的房间里就这个定义达成共识。:) 我们实际上将从不可变集合的和方法中删除值相等性,以便这些方法提供与 BCL 和客户代码中的大多数其他类型相同的速度(并且几乎无用)。EqualsGetHashCode
我们非常希望在未来的版本中为不可变集合添加值相等的方法。