En c # que signifie «où T: classe»?

135

En C # que fait where T : class signifie?

C'est à dire.

public IList<T> DoThis<T>() where T : class
Makach
la source

Réponses:

115

En termes simples, cela contraint le paramètre générique à une classe (ou plus spécifiquement à un type de référence qui pourrait être un type de classe, d'interface, de délégué ou de tableau).

Consultez cet article MSDN pour plus de détails.

Andy Rose
la source
4
Vous avez manqué un cas. L'argument de type pour T peut également être n'importe quel autre paramètre de type contraint à être un type de référence .
Eric Lippert
38

C'est une contrainte de type générique . Dans ce cas, cela signifie que le type générique Tdoit être un type de référence (type classe, interface, délégué ou tableau).

Oded
la source
35

C'est une contrainte de type sur T, spécifiant qu'il doit s'agir d'une classe.

La whereclause peut être utilisée pour spécifier d'autres contraintes de type, par exemple:

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

Pour plus d'informations, consultez la page MSDN sur la whereclause ou les contraintes de paramètres génériques .

Donut
la source
5
Il est possible de les combiner ensemble, par exemple:where T : class, IComparable, new()
Izzy
17

Cela se limite Taux types de référence . Vous ne pourrez pas y mettre de types valeur ( structs et types primitifs sauf string).

Vilx-
la source
Cette réponse (et quelques autres avec les mêmes informations) m'a été plus utile que celle sélectionnée, car elle donne un exemple de ce que T ne peut pas être (je me demandais ce que cette contrainte ajoutait réellement à l'histoire)
minutes
9

cela signifie que le type utilisé Tlorsque la méthode générique est utilisée doit être une classe - c'est-à-dire qu'il ne peut pas être une structure ou un nombre intégré comme intoudouble

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();
Isak Savo
la source
8

where T: class signifie littéralement que T has to be a class. Il peut s'agir de n'importe quel type de référence. Maintenant , chaque fois que le code appelle votre DoThis<T>()méthode , il doit fournir une classe pour remplacer T . Par exemple, si je devais appeler votre DoThis<T>()méthode, je devrai l'appeler comme suit:

DoThis<MyClass>();

Si votre metthod ressemble à ce qui suit:

public IList<T> DoThis<T>() where T : class
{
   T variablename = new T();

   // other uses of T as a type

}

Ensuite, partout où T apparaît dans votre méthode, il sera remplacé par MyClass. Ainsi, la méthode finale que le compilateur appelle ressemblera à ce qui suit:

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
 }
explorateur
la source
4
-1: new T()n'est pas possible avec where T : class. vous devez spécifier where T: new()pour être autorisé à le faire.
esskar
@explorer peut nous définir une seule méthode générique et l'appeler de plusieurs endroits pour insérer un enregistrement en passant différents paramètres à partir de différents endroits.
Zaker
4

T représente un type d'objet de, cela implique que vous pouvez donner n'importe quel type de. IList: si IList s = new IList; Maintenant s.add ("Toujours accepter la chaîne.").

AsifQadri
la source
2

Ici, T fait référence à une classe, ce peut être un type de référence.

Hemant Kumar
la source
1

«T» représente un type générique. Cela signifie qu'il peut accepter n'importe quel type de classe. L'article suivant peut vous aider:

http://www.15seconds.com/issue/031024.htm
Randy Minder
la source