違い

2012-03-19 6 views
2

何の違い宣言の間があります。違い

GenericClass<T> genericInst = new GenericClass<T>(); 

ここで

GenericClass<baseClass> temp = new GenericClass<baseClass>(); 

がGenericClassが where T : baseClass

GenericClassのためになるように定義されるが、一般的なが含まれていますリスト

private List<T> vals = new List<T>(); 
+0

上記のTをどのような文脈で使用していますか?種別: –

答えて

1

もし私が間違っているなら、それはタイプTのデフォルトであるかのように 'T:baseClass'をbaseClassにしていますか?

、これは当てはまらないもしそうであれば、専門where T : baseClassは(それが代わりにクラスのインターフェイスであった場合、または実装)タイプTbaseClass又はbaseClass由来するなければならないことを意味します。したがって

、あなたが持っていた場合:

public class GenericClass<T> where T : baseClass 
{ 
} 

を次にあなたが言うことができます。

var x = new GenericClass<baseClass>(); 

それとも

var y = new GenericClass<SomethignDerivedFromBaseClass>(); 

をしかし、あなたが言うことができませんでした:

var z = new GenericClass<int>(); 

intbaseClassから継承されていません。

あなたが実際にGenericClass<T>内からコード行を呼び出した場合、実際に上記のインスタンスでTを使用する唯一の方法は次のとおりです。

public GenericClass<T> where T : baseClass 
{ 
    void SomeMethod() 
    { 
     GenericClass<T> genericInst = new GenericClass<T>(); 
    } 
} 

またはTはすでにサブあることが知られている別の文脈からbaseClassのクラス。

public class GenericClass<T> where T : baseClass 
{ 
    public List<T> Items { get; set; } 

    ... 
} 

を使用すると、リストに基底クラスから派生し、物事を追加し、答えることができるかどうか:あなたはあなたが持っていた場合、その疑問に思っているようにあなたのコメントに基づいて

UPDATE

は、それが聞こえますはい、そうです。 baseClassを継承するTに対して、クラスGenericClass<T>を宣言できます。しかし、List<T>はまだタイプしても強いタイプのTとなります。これらを与えている

TBaseClassになりますので、

public class BaseClass { } 
public class SubClass : BaseClass { } 

GenericClass<BaseClass>がそれにBaseClassと​​の両方を保持することができますがList<T>です。

しかしGenericClass<SubClass>Tが​​になりますので、唯一​​またはその継承の項目を保持することができList<T>を持つことになります。

+0

私はbaseclassパラメータを使用して宣言すれば、キャストによってこの派生型に派生型を含めることはできませんか? – gwizardry

+0

リストは、すべてのT 'がTであるため、キャストせずにTから派生したタイプのアイテムを保持できます。つまり、リストは長方形、円、四角形を保持できます。つまり、リストはリストに直接キャストできません。そうでないと問題が発生します。 –

+0

私は相続チェーンをキャストすることを誤解していると思います。 リストが長方形を保持できるのであれば、なぜ汎用性が必要なのでしょうか。 – gwizardry