对 Equals(object) 的递归调用¶
ID: cs/recursive-equals-call
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- reliability
- maintainability
Query suites:
- csharp-security-and-quality.qls
对 Equals(object)
的递归调用通常是在尝试转发到具有更具体的参数类型的另一个 Equals
方法时意外进行的。这往往会导致堆栈溢出异常。
建议¶
解决方案是在进行调用时检查参数是否为适当的类型,然后进行强制转换。
示例¶
在此示例中,当程序员明确希望将对象传递给 Equals(C)
方法但忘记了进行强制转换以实现此目的时,会反复调用 Equals(object)
方法。
class RecursiveEquals
{
class C
{
private int i = 0;
public override bool Equals(object rhs)
{
if (rhs.GetType() != this.GetType()) return false;
return Equals(rhs);
}
public bool Equals(C rhs)
{
return (rhs != null && this.i == rhs.i);
}
}
}
可以通过在进行第二次调用之前执行强制转换来轻松更正此错误。
class RecursiveEqualsFix
{
class C
{
private int i = 0;
public override bool Equals(object rhs)
{
if (rhs.GetType() != this.GetType()) return false;
return Equals((C)rhs);
}
public bool Equals(C rhs)
{
return (rhs != null && this.i == rhs.i);
}
}
}