CodeQL 文档

Equals 方法中的未检查强制转换

ID: cs/unchecked-cast-in-equals
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - reliability
   - maintainability
Query suites:
   - csharp-security-and-quality.qls

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

由于 Equals 采用 object,因此可以向其传递具有任意动态类型的参数:特别是,不能保证将参数强制转换为声明 Equals 方法的类型是合法的。因此,在不事先检查参数的动态类型的情况下就执行此类强制转换的代码是不安全的,并且如果传入错误动态类型的参数,则可能会中断。

建议

要解决此问题,请在执行此类强制转换之前测试参数的动态类型。

示例

此示例演示了将 object 强制转换为 UncheckedCastInEquals。这可能会导致问题,因为如果对象不是 UncheckedCastInEquals,则程序会因 InvalidCastException 而崩溃。

class UncheckedCastInEquals
{
    private int i = 23;

    public override bool Equals(object obj)
    {
        UncheckedCastInEquals rhs = (UncheckedCastInEquals)obj;

        return i == rhs.i;
    }
}

一个简单的解决方法是在执行强制转换之前确认强制转换是否会成功。

class UncheckedCastInEqualsFix
{
    private int i = 23;

    public override bool Equals(object obj)
    {
        if (obj.GetType() != this.GetType())
            return false;

        UncheckedCastInEqualsFix rhs = (UncheckedCastInEqualsFix)obj;

        return i == rhs.i;
    }
}
  • ©GitHub, Inc.
  • 条款
  • 隐私