2016-05-16 93 views
1

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

而不是在每个派生类中有一个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"); 
    } 
} 
+1

单词'static'和'instance'本质上是相反的... – code4life

+0

你想让B和C共享一个列表,并且都在它们的静态ctors中添加项目吗?或者你想让B和C有独立的*静态列表? – Blorgbeard

+0

我想'B'和'C'有不同的静态列表,我不在乎'A'。 @Blorgbeard – shinzou

回答

1

你不能 “实例” 一static场。 A无法指定所有派生类将具有特定的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" 

如果你想有一个类有一个静态属性,你必须给它一个静态属性。它不能从基类继承它。

2

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

protected static readonly List<string> x = new List<string>(); 
相关问题