当密封覆盖方法是通用的时,为什么警告 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...
鉴于以下 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...