为什么我的直接Equals调用通过了,但在嵌套时失败了



我正在尝试为代码中的一些结构实现Equals重写。我有以下"子"结构

public struct ChildStruct
{
public bool Valid;
public int Value1;
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType()) 
{
return false;
}
ChildStruct other = (ChildStruct) obj;
return Valid == other.Valid && Surface == other.Value1;
}
}

这个"父"结构,其中一个成员是ChildStructs的数组

public struct ParentStruct
{
public int Id;
public ChildStruct[] children;
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType()) 
{
return false;
}
ParentStruct other = (ParentStruct) obj;
// am I comparing ChildStructs array correctly?
return Id == other.Id && children == other.children;
}
}

在我重写Equals方法的Nunit测试中,直接比较ChildStruct类型的对象通过,但我对ParentStructs的单元测试失败了。我是否在ParentStruct中的Equals重写中遗漏了一些内容来解释数组?子Equals方法是否未枚举到子数组中的所有元素?

Nunit代码:

[Test]
public void ChildEqual()
{ 
var child1 = new ChildStruct{Valid = true, Value1 = 1};
var child2 = new ChildStruct{Valid = true, Value1 = 1};
// passes!
Assert.AreEqual(child1, child2);
}
[Test]
public void ParentEqual()
{ 
var child1 = new ChildStruct{Valid = true, Value1 = 1};
var child2 = new ChildStruct{Valid = true, Value1 = 1};
var parent1 = new ParentStruct{Id = 1, children = new[] {child1, child2}}
var parent2 = new ParentStruct{Id = 1, children = new[] {child1, child2}}
// fails during checking for equality of children array!
Assert.AreEqual(parent1, parent2);
}

为了使ParentStruct相等,您需要确定是什么使ChildStruct的两个数组相等,并相应地更改ParentStruct的equals方法的最后一行。例如,如果它们只被认为是"相等的",如果它们包含相同顺序的等价子,这将起作用:

return Id == other.Id && children.SequenceEqual(other.children);

最新更新