CodeQL 文档

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

点击查看 CodeQL 代码库中的查询

当通过使类实现 IComparable 接口在类的实例上引入排序时,确保对于所有实例 c1c2c1.CompareTo(c2) == 0c1.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));
    }
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私