有没有办法让抽象类中的静态只读字段在派生类中实例化?
不是在每个派生类中都有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");
}
}
答案 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
您可以看到C
和B 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>
如果您希望类具有静态属性,则必须为其提供静态属性。它不能从基类继承它。