有没有办法让抽象 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>();
}
您可以看到 B
和 C
都使用相同的底层列表:
B b = new B();
C c = new C();
c.X.Dump(); // "asdf, qwer, rrrr, tttt"
如果你想让一个class有一个静态的属性,你必须给它一个静态的属性。它不能从基础 class.
继承它
有没有办法让抽象 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>();
}
您可以看到 B
和 C
都使用相同的底层列表:
B b = new B();
C c = new C();
c.X.Dump(); // "asdf, qwer, rrrr, tttt"
如果你想让一个class有一个静态的属性,你必须给它一个静态的属性。它不能从基础 class.
继承它