C#是否为未使用的模板参数生成具体实现?

时间:2012-10-22 13:31:44

标签: c# generics inheritance static

如果我有

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()方法。)

2 个答案:

答案 0 :(得分:5)

具有不同类型参数的泛型类的两个实例将产生两个独立的类,每个类都有自己的一组静态变量。所以答案是肯定的,静态变量Base<ClassA>.MyStaticListBase<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