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

时间:2015-08-20 18:32:24

标签: c# generics code-analysis

鉴于以下课程heirarchy:

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()即可解决代码分析警告CA2214。到目前为止,非常好。

现在让我们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警告返回。为什么呢?

警告说明引用了以下调用堆栈:

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

...即使Derived1.Do()上的断点被击中就好了。

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

1 个答案:

答案 0 :(得分:1)

规则实现不实现参数匹配逻辑,该逻辑识别具有泛型参数的方法的调用。这很可能是规则实施中的一个缺陷,而不是有意将通用方法排除在密封解决方案之外。您可能需要考虑将违规视为误报。然而,这种抑制会导致未来未开封的方法未被发现,所以YMMV ......