2009-03-07 4 views
11

where T : somevalueの意味は?私はちょうどwhere T : Attributeと言ったコードを見た。これはジェネリックと何か関係があると思いますが、これが何を意味するのか、それが何をしているのかは分かりません。「T:somevalue」はどういう意味ですか?

誰でも知っていますか?

答えて

28

それはジェネリッククラスまたはメソッドに指定された型Tは、例えば、クラスAttribute

から継承しなければならないことを意味し、constraint on a type parameterである:それは一般的なことができますので

public class Foo<T> : 
    where T : Attribute 
{ 
    public string GetTypeId(T attr) { return attr.TypeId.ToString(); } 
// .. 
} 

Foo<DescriptionAttribute> bar; // OK, DescriptionAttribute inherits Attribute 
Foo<int> baz; // Compiler error, int does not inherit Attribute 

これは、便利ですクラスTのオブジェクトを使ってオブジェクトを処理するには、Tの何ものもAttributeでなければならないという知識が必要です。上記の例では

TypeIdAttributeの財産であり、attrTあるので、それはAttributeから継承するタイプでなければならないので、それはattrTypeIdを照会するGetTypeIdために大丈夫です。

制約も同じ効果で、一般的な方法で使用することができます。

public static void GetTypeId<T>(T attr) where T : Attribute 
{ 
    return attr.TypeId.ToString(); 
} 

あなたがタイプに置くことができる他の制約があります。 MSDNから:

where T: struct

type引数は値 型でなければなりません。 Nullable を除く任意の値型を指定できます。

where T : class

型引数が参照 タイプでなければなりません。これはどのクラス、 インターフェイス、デリゲート、または配列タイプにも当てはまります。

where T : new()

型引数は、公共 パラメータなしのコンストラクタを持っている必要があります。 を他の制約と共に使用すると、 が最後に指定されなければなりません。 new()制約を最後に指定する必要があります。

where T : <base class name>

型引数があるか、指定された基本クラスから を派生しなければなりません。

where T : <interface name>

型引数があるか 指定されたインタフェースを実装する必要があります。複数の インターフェイスの制約は に指定できます。拘束インターフェイス も汎用品にすることができます。

where T : U

T、指定された型引数は であるか、または はこれが裸 型制約と呼ばれているU.のために与えられた引数から派生しなければなりません。

+0

+1これはかなり包括的です。私は答えを好きになることを願っています。 – Sung

1

where節は、ジェネリックを使用するときに渡すことができる引数を制限するために使用されます。ジェネリッククラスを作成するときは、クラスでTをどのように使用するかによって、引数の型を指定することをお勧めします。 System.Objectが何をすることができるか以外に何かがある場合は、constraintを使用することをお勧めします。これは、コンパイル時エラーとランタイムを取得するためです。

あなたはクラス

class Person<T> where T : System.IComparable<T> 
{ 
    //can now use CompareTo 
} 

を作成する場合は、IComparableを実装していません。このクラスは何も渡さないですることはできません。したがって、Personクラスに渡されたものに対してCompareToを使用することは今や安全です。

1

一般的な引数として使用する型を制限する方法です。だから、:

where T : SomeType 

TはどちらかがSomeTypeから派生またはインタフェースSomeType他の人が、あなたも以下の持って言ったことに加え

5

を実装しなければならないことを意味:

  • 新しいです( ) - Tにはデフォルトコンストラクタが必要です
  • クラス - Tは参照型である必要があります
  • 構造体 - Tは値型でなければなりません
関連する問題