.Equals返回意外的结果
请参阅下面的代码:.Equals返回意外的结果
public class ValueType<T> where T : class,new() {
public virtual bool Equals(T other)
{
if (other == null)
return false;
Type t = GetType();
Type otherType = other.GetType();
if (t != otherType)
return false;
FieldInfo[] fields = t.GetFields(System.Reflection.BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
foreach (FieldInfo field in fields)
{
object value1 = field.GetValue(other);
object value2 = field.GetValue(this);
if (value1 == null)
{
if (value2 != null)
return false;
}
else if (!value1.Equals(value2))
return false;
}
return true;
}
}
class Tiger : ValueType<Tiger> { public string name; public Tiger mother; }
class Program
{
static void Main(string[] args)
{
Tiger t1 = new Tiger() { name = "Teri" };
Tiger t2 = new Tiger() { name = "Teri" };
Tiger t3 = new Tiger() { name = "Toni", mother=t1 };
Tiger t4 = new Tiger() { name = "Toni", mother = t2 };
bool Test1 = t4.mother.Equals(t3.mother); //Highlighed line
bool Test2 = t4.Equals(t3);
}
}
我不明白为什么突出显示的行返回false。我希望它运行在一个无限循环中。
回答:
为什么你期待一个无限循环?继回报true
不false
:
bool Test1 = t4.mother.Equals(t3.mother); .
那不是预期的,因为这两个母亲都是平等的吗?他们有相同的name
,没有“祖母”。他们的mother
字段返回null
,因为Tiger
是引用类型(类)。
为什么
t4.Equals(t3)
返回false
?
因为您已声明它为Object
,所以使用Object.Equals
只是比较引用。如果你尝试将它投射到Tiger
这个Equals
将被调用。
这就是为什么这不会导致一个无限循环,但只是返回false
(不一样的参考):
...else if (!value1.Equals(value2))
注意,你没有覆盖Equals
。如果你愿意,你会得到预期的行为:
class Tiger : ValueType<Tiger> { public string name; public Tiger mother;
public override bool Equals(object obj)
{
return ((ValueType<Tiger>) obj).Equals(this);
}
}
现在,按预期工作。它不会导致无限递归,因为在某些时候,父母mother
将是null
,但它会递归检查母亲是否相等。
另一种方式是改变的签名已经存在于ValueType
Equals
:
public override bool Equals(Object other)
以上是 .Equals返回意外的结果 的全部内容, 来源链接: utcz.com/qa/263210.html