2012-10-22 31 views
2

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

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变量?

(I需要这个定制的枚举类类层次结构的availableValues()方法。)

回答

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 
+0

即使未使用类型参数*根本* *所以我可以使用“未使用”类型参数来强制创建单独的MyStaticList? – B3ret

+1

@ B3ret绝对可以。即使不使用该类型,也会得到与使用不同类型参数集创建的类不兼容的不同类。 – dasblinkenlight

5

具有不同类型参数的泛型类的两个实例将导致两个独立的类,每个类都有其自己的一组静态变量。所以答案是肯定的,静态变量Base<ClassA>.MyStaticListBase<ClassB>.MyStaticList将是独立的。

如果你想一个相反的行为(即所有泛型类共享同一个静态变量)移动的变量声明为一个非通用类,并使其成为基类的通用的,就像这样:

public class BaseOfGeneric { 
    protected static List<string> MyStaticList; 
} 
abstract class Base<TSub> : BaseOfGeneric 
{ 
    ... 
} 

现在,所有Base<T>的实例将共享相同的MyStaticList,而不管它们的类型参数如何。

相关问题