C#ではwhere T : class
はどういう意味ですか?
すなわち。
public IList<T> DoThis<T>() where T : class
簡単に言えば、これはジェネリックパラメーターをクラス(または、より具体的には、クラス、インターフェイス、デリゲート、または配列型になり得る参照型)に制約することです。
詳細は MSDNの記事 をご覧ください。
汎用型制約 です。この場合、ジェネリック型T
は参照型(クラス、インターフェイス、デリゲート、または配列型)でなければならないことを意味します。
これはT
の型制約であり、クラスでなければならないことを指定します。
where
句を使用して、他の型制約を指定できます。例:
where T : struct // T must be a struct
where T : new() // T must have a default parameterless constructor
where T : IComparable // T must implement the IComparable interface
詳細については、MSDNのページで where
句 、または 一般的なパラメーター制約 をご覧ください。
これは、T
を参照型に制限します。値型(struct
sおよびstring
を除くプリミティブ型)をそこに配置することはできません。
つまり、ジェネリックメソッドを使用するときにT
として使用される型はクラスでなければなりません。つまり、int
やdouble
のような構造体または組み込みの数値にすることはできません。
// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();
where T: class
は、文字通りT has to be a class
を意味します。任意の参照タイプを使用できます。これで、コードがDoThis<T>()
メソッドを呼び出すたびに、Tを置き換えるクラスを提供する必要があります。たとえば、DoThis<T>()
メソッドを呼び出す場合、次のように呼び出す必要があります。
DoThis<MyClass>();
あなたの方法が次のような場合:
public IList<T> DoThis<T>() where T : class
{
T variablename = new T();
// other uses of T as a type
}
その後、メソッド内でTが出現する場所は、MyClassに置き換えられます。そのため、コンパイラが呼び出す最終メソッドは次のようになります。
public IList<MyClass> DoThis<MyClass>()
{
MyClass variablename= new MyClass();
//other uses of MyClass as a type
// all occurences of T will similarly be replace by MyClass
}
これは、型パラメーター制約と呼ばれます。事実上、タイプTの種類を制限します。
Type引数は参照型である必要があります。これは、クラス、インターフェイス、デリゲート、または配列タイプにも適用されます。
Tはオブジェクトの種類を表し、任意の種類を指定できることを意味します。 IList:IList s = new IListの場合; s.add( "Always accept string。")になりました。
ここで、Tはクラスを指します。参照型でもかまいません。
「T」は汎用タイプを表します。これは、あらゆるタイプのクラスを受け入れることができることを意味します。次の記事が役立ちます。
http://www.15seconds.com/issue/031024.htm