2012-10-22 34 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,而不管它們的類型參數如何。

相關問題