当密封覆盖方法是通用的时,为什么警告 CA2214 没有得到解决?

Why is warning CA2214 not resolved when a sealed override method is generic?

鉴于以下 class 层次结构:

class Base
{
    protected virtual void Do(int value)
    {
    }
}

class Derived1 : Base
{
    sealed protected override void Do(int value)
    {
        base.Do(value);
    }
}

class Derived2 : Derived1
{
    public Derived2()
    {
        Do(999);
    }
}

...代码分析警告CA2214 只需将sealed 关键字添加到Derived1.Do() 即可解决。到目前为止,还不错。

现在让我们将 Do() 设为通用:

class Base
{
    protected virtual void Do<T>(T value)
    {
    }
}

class Derived1 : Base
{
    sealed protected override void Do<T>(T value)
    {
        base.Do(value);
    }
}

class Derived2 : Derived1
{
    public Derived2()
    {
        Do(999);
    }
}

CA2214 警告returns。为什么?

警告的描述引用了以下调用堆栈来查看:

Derived2..ctor()
Base.Do<T>(T):Void

...即使在 Derived1.Do() 上设置断点也很好。

注意:.NET 4.5 和 4.6 都是这种情况

规则实现未实现识别具有通用参数的方法调用的参数匹配逻辑。这很可能是规则实施中的一个缺陷,而不是从密封解决方案中故意排除通用方法。您可能需要考虑将违规抑制为误报。但是,这种抑制会导致未来可能未检测到该方法的开封,因此 YMMV...