我正在尝试为代码中的一些结构实现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);