如果我有
abstract class Base<TSub>
{
protected static List<TSub> MyStaticList;
}
class DerivedA : Base<DerivedA>
{
}
class DerivedB : Base<DerivedB>
{
}
我得到两个独立的MyStaticList变量,每个基类一个。 如果相反,基数看起来像这样
class Base<TSub>
{
protected static List<string> MyStaticList;
}
即,模板参数没有使用,我保证还能获得两个独立的MyStaticList变量吗?
(我需要这个用于自定义类Enum类层次结构的availableValues()
方法。)
答案 0 :(得分:5)
具有不同类型参数的泛型类的两个实例将产生两个独立的类,每个类都有自己的一组静态变量。所以答案是肯定的,静态变量Base<ClassA>.MyStaticList
和Base<ClassB>.MyStaticList
将是独立的。
如果您希望相反的行为(即所有泛型类共享相同的静态变量)将变量声明移动到非泛型类中,并使其成为泛型的基类,如下所示:
public class BaseOfGeneric {
protected static List<string> MyStaticList;
}
abstract class Base<TSub> : BaseOfGeneric
{
...
}
现在Base<T>
的所有实例都会共享相同的MyStaticList
,无论其类型参数如何。
答案 1 :(得分:2)
http://blogs.msdn.com/b/gusperez/archive/2005/08/09/449363.aspx
泛型类声明中的静态变量在所有类中共享 相同封闭构造类型的实例(第26.5.2节),但不是 在不同的封闭构造类型的实例之间共享。这些 无论静态变量的类型是什么,规则都适用 涉及任何类型参数。
修改强> 在Generic List and static variable behaviour in c#
之前提出了一个非常类似的问题您必须使用完全静态的构造才能在泛型类中使用。也许像是......
protected static List<TSub> MyStaticList = BaseUtil.MyStaticList