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

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.


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


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 .


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).


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>();

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
 }

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.").


2

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.