不一致的 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 方法。