System.Collections.Immutable 类型:为什么没有 .Equals

Kal*_*evi 6 .net c# immutability

var a = ImmutableList<int>.Empty.Add(1).Add(2).Add(3);
var b = ImmutableList<int>.Empty.Add(1).Add(2).Add(3);

Console.WriteLine(a.Equals(b)); // False
Run Code Online (Sandbox Code Playgroud)

在上面的代码a.Equals(b)调用中Object.Equals,因为ImmutableList<T>没有覆盖Equals(object),并且ImmutableList<T>引用类型Object.Equals会(无用的)引用比较。

问题:为什么不ImmutableList<T>覆盖.Equals?将每个包含的对象与每个包含的对象进行比较.Equals并根据这些比较返回结果将是直接的并且期望。测试框架的其余部分甚至是一致的(请参阅 参考资料class String

注意:上面的代码是用 System.Collections.Immutable.1.1.38-beta-23516

Cor*_*son 4

您要做的就是测试集合的内容是否相等。没有 .NET 集合重写Equals来执行此操作。相反,使用SequenceEqual

Console.WriteLine(a.SequenceEqual(b));
Run Code Online (Sandbox Code Playgroud)

至于为什么——我想这是一个见仁见智的问题。大多数面向参考的平台都尽力不将参考平等与内容平等混淆。

String实际上是非常特殊的情况,尽管它确实实现了IEnumerable,但通常不被视为 /etc 意义上的适当容器List。是。