鉴于以下课程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都是这种情况
答案 0 :(得分:1)
规则实现不实现参数匹配逻辑,该逻辑识别具有泛型参数的方法的调用。这很可能是规则实施中的一个缺陷,而不是有意将通用方法排除在密封解决方案之外。您可能需要考虑将违规视为误报。然而,这种抑制会导致未来未开封的方法未被发现,所以YMMV ......