在构造函数中访问已实现的抽象属性会导致CA2214:不要在构造函数中调用可覆盖的方法

时间:2013-06-10 07:11:30

标签: c# .net inheritance virtual code-analysis

public abstract class MyBase
{
    public abstract bool MyProperty
    {
        get;
        protected set;
    }
}

public class MyClass : MyBase
{
    public MyClass()
    {
        this.MyProperty = true;
    }

    public override bool MyProperty
    {
        get;
        protected set;
    }
}

构造函数MyClass()导致CA2214:

  

不要在构造函数中调用可覆盖的方法。

这通常仅显示是否调用与构造函数在同一类中定义的虚方法。例如在MyProperty的构造函数中访问MyBase。在这里,我在派生类的构造函数中调用继承的抽象属性的非虚拟重写实现

1 个答案:

答案 0 :(得分:10)

不,它仍然是虚拟的,因为override没有隐含地封锁该成员。 (尝试一下:从MyClass派生另一个类,然后再次覆盖MyProperty。)

你可以明确地密封它:

public override sealed bool MyProperty
{
    get;
    protected set;
}

此时我希望警告消失。