Réponses:
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.
C'est une contrainte de type générique . Dans ce cas, cela signifie que le type générique T
doit être un type de référence (type classe, interface, délégué ou tableau).
C'est une contrainte de type sur T
, spécifiant qu'il doit s'agir d'une classe.
La where
clause 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 where
clause ou les contraintes de paramètres génériques .
where T : class, IComparable, new()
Cela se limite T
aux types de référence . Vous ne pourrez pas y mettre de types valeur ( struct
s et types primitifs sauf string
).
cela signifie que le type utilisé T
lorsque 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 int
oudouble
// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();
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
}
new T()
n'est pas possible avec where T : class
. vous devez spécifier where T: new()
pour être autorisé à le faire.
C'est ce qu'on appelle une contrainte de paramètre de type. En fait, il contraint ce que peut être le type T.
L'argument type doit être un type référence; cela s'applique également à tout type de classe, d'interface, de délégué ou de tableau.
Contraintes sur les paramètres de type (Guide de programmation C #)
Ici, T fait référence à une classe, ce peut être un type de référence.
«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