c#で「where T:class」はどういう意味ですか?


135

C#ではwhere T : classどういう意味ですか?

すなわち。

public IList<T> DoThis<T>() where T : class

回答:


115

簡単に言えば、これはジェネリックパラメーターをクラス(より具体的には、クラス、インターフェイス、デリゲート、または配列型の参照型)に制約することです。

詳細については、このMSDNの記事を参照してください。


4
1件のケースを逃しました。Tの型引数は、参照型に制限されている他の型パラメーターにすることもできます
Eric Lippert、2010

38

これはジェネリック型制約です。この場合、ジェネリック型Tは参照型(クラス、インターフェイス、デリゲート、または配列型)でなければなりません。


35

これはの型制約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または汎用パラメーターの制約に関するページをご覧ください。


5
これらを組み合わせることが可能です。例:where T : class, IComparable, new()
Izzy

17

これT参照型に限定されます。値型(structとを除くプリミティブ型string)をそこに置くことはできません。


この回答(および同じ情報を持つ他のいくつかの回答)は、選択した回答よりも私にとって有用でした。これは、Tができないことの例を示しているためです(この制約が実際にストーリーに追加されたのは何なのかと思っていました)
mins

9

これはT、ジェネリックメソッドが使用されるときに使用される型がクラスでなければならないことを意味します。つまり、構造体やintdouble

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();

8

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
 }

4
-1:new T()は使用できませんwhere T : class。それをwhere T: new()許可するように指定する必要があります。
esskar 2013年

@explorerでは、単一のジェネリックメソッドを定義し、複数の場所から呼び出して、異なる場所から異なるパラメーターを渡すことでレコードを挿入できます。
Zaker


4

Tはオブジェクトタイプを表し、任意のタイプを指定できることを意味します。IList:IListの場合s = new IList; s.add( "Always accept string。")になりました。



1

'T'はジェネリック型を表します。つまり、あらゆるタイプのクラスを受け入れることができます。次の記事が役立つかもしれません:

http://www.15seconds.com/issue/031024.htm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.