【问题标题】:Accessing an implemented abstract property in the constructor causes CA2214: Do not call overridable methods in constructors在构造函数中访问已实现的抽象属性会导致 CA2214:不要在构造函数中调用可覆盖的方法
【发布时间】:2013-06-05 19:05:10
【问题描述】:
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:

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

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

【问题讨论】:

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


    【解决方案1】:

    不,它仍然是虚拟的,因为override 不会隐式地密封该成员。 (试试看:从MyClass派生另一个类,你可以再次覆盖MyProperty。)

    你可以明确地密封它:

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

    那时我希望警告会消失。

    【讨论】:

    • 我认为一切都必须明确声明为虚拟的,包括被覆盖的成员。
    • @Kurian:不。事实上,您不能在同一方法中同时指定overridevirtual
    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2014-01-18
    • 2023-04-02
    • 1970-01-01
    • 2011-08-31
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多