不一致的 CompareTo 和 Equals¶
ID: cs/inconsistent-compareto-and-equals
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- maintainability
Query suites:
- csharp-security-and-quality.qls
当通过使类实现 IComparable 接口在类的实例上引入排序时,确保对于所有实例 c1 和 c2,c1.CompareTo(c2) == 0 ⇔ c1.Equals(c2) 是合理的。实现 IComparable.CompareTo 但继承 Equals(而不是重写它以匹配 CompareTo 实现)的类通常会违反此假设,这在使用该类时会导致混淆。
如果该类型实现了 IComparable,则应重写 Equals。
- Microsoft:重载 Equals() 和运算符 == 的准则
建议¶
实现 CompareTo 的类通常还应重写 Equals 以提供一致的实现。
示例¶
以下示例输出
Comparing a1 with a2: 0
a1 equals a2: False
这显然是不可取的,因为它显示了 CompareTo 的行为与 Equals 的行为之间存在不一致。
class InconsistentCompareTo
{
class Age : IComparable<Age>
{
private int age;
public Age(int age)
{
this.age = age;
}
public int CompareTo(Age rhs)
{
return age.CompareTo(rhs.age);
}
}
public static void Main(string[] args)
{
Age a1 = new Age(22);
Age a2 = new Age(22);
Console.WriteLine("Comparing a1 with a2: " + a1.CompareTo(a2));
Console.WriteLine("a1 equals a2: " + a1.Equals(a2));
}
}
参考¶
MSDN:IComparable.CompareTo 方法。