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…另请参见。