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

C# 当密封覆盖方法是通用的时,为什么警告CA2214没有得到解决?,c#,generics,code-analysis,C#,Generics,Code Analysis,鉴于以下等级继承权: 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() {

鉴于以下等级继承权:

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);
    }
}
。。。只需将
sealed
关键字添加到
Derived1.Do()
,即可解决代码分析警告。到目前为止,一切顺利

现在让我们将
Do()
generic:

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);
    }
}
类基
{
受保护的虚拟空Do(T值)
{
}
}
派生类1:基
{
密封保护覆盖无效Do(T值)
{
base.Do(value);
}
}
类Derived2:Derived1
{
公之于众2()
{
Do(999);
}
}
CA2214警告返回。为什么?

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

Derived2..ctor()
Base.Do<T>(T):Void
Derived2..ctor()
Base.Do(T):无效
…即使
Derived1.Do()
上的断点命中得很好


注意:.NET 4.5和4.6都是这种情况。规则实现不实现参数匹配逻辑,该逻辑可识别具有泛型参数的方法调用。这很可能是规则实现中的一个缺陷,而不是有意将通用方法从密封解决方案中排除。你可能想考虑把违规行为当作假阳性。然而,这种抑制可能会导致该方法在未来被拆封而未被检测到,因此YMMV…

另请参见。