有没有办法让抽象类中的静态只读字段在派生类中实例化?

时间:2016-05-16 21:59:17

标签: c# inheritance static abstract-class readonly

有没有办法让抽象类中的静态只读字段在派生类中实例化?

不是在每个派生类中都有static readonly字段,我更喜欢它在它们的基类中,并且每个派生都会实例化它自己的唯一字段(该字段在每个派生类中都有不同的值)

例如这样的事情:(但它不起作用)

public static void Main()
{
    B b = new B(); //TypeInitializationException
    var q = b.X;
}

public abstract class A
{
    protected static readonly List<string> x;
}

public class B : A
{
    public List<string> X
    {
        get { return x; }
    }
    static B()
    {
        x.Add("asdf");
        x.Add("qwer");
        //or do this instead but it gives an error
        //x = new List<string>() { "qwer", "asdf" }; 
    }
}

public class C : A
{
    public List<string> X
    {
        get { return x; }
    }
    static C()
    {
        x.Add("rrrr");
        x.Add("tttt");
    }
}

2 个答案:

答案 0 :(得分:2)

如果捕获异常,则存在NullReferenceException的内部异常。尝试初始化成员x

protected static readonly List<string> x = new List<string>();

答案 1 :(得分:1)

您无法“实例化”A字段。 static无法指定所有派生类都具有特定的A.x字段或属性。

即使您通过初始化public abstract class A { protected static readonly List<string> x = new List<string>(); } 修复了TypeLoadException:

B

您可以看到CB b = new B(); C c = new C(); c.X.Dump(); // "asdf, qwer, rrrr, tttt" 都使用相同的基础列表:

<p style="background-color: rgba(255, {{color}}, {{color}}, 1);" >Hello!</p>

如果您希望类具有静态属性,则必须为其提供静态属性。它不能从基类继承它。