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

Is there a way to have a static readonly field in an abstract class to be instantiated in derived classes?

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

与其在每个派生 class 中有一个 static readonly 字段,我更希望它在它们的基础 class 中,并且每个派生都将实例化自己的唯一字段(每个派生的字段将具有不同的值 class).

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

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");
    }
}

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

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

您不能 "instantiate" static 字段。 A 无法指定所有派生的 classes 都将具有特定的 static 字段或 属性.

即使您通过初始化 A.x 修复了 TypeLoadException:

public abstract class A
{
    protected static readonly List<string> x = new List<string>();
}

您可以看到 BC 都使用相同的底层列表:

B b = new B();
C c = new C();
c.X.Dump();     // "asdf, qwer, rrrr, tttt"

如果你想让一个class有一个静态的属性,你必须给它一个静态的属性。它不能从基础 class.

继承它