Que signifie “où T: somevalue”?

Que veut dire where T : somevalue ? Je viens de voir un code qui dit where T : Atsortingbute . Je pense que cela a quelque chose à voir avec les génériques mais je ne suis pas sûr de ce que cela signifie ou ce qu’il fait.

Est-ce que quelqu’un sait?

C’est une contrainte sur un paramètre de type , ce qui signifie que le type T atsortingbué à une classe ou à une méthode générique doit hériter de la classe Atsortingbute

Par exemple:

 public class Foo : where T : Atsortingbute { public ssortingng GetTypeId(T attr) { return attr.TypeId.ToSsortingng(); } // .. } Foo bar; // OK, DescriptionAtsortingbute inherits Atsortingbute Foo baz; // Comstackr error, int does not inherit Atsortingbute 

C’est utile, car cela permet à la classe générique de faire des choses avec des objects de type T en sachant que tout ce qui est un T doit également être un Atsortingbute .

Dans l’exemple ci-dessus, GetTypeId peut interroger le TypeId de attr car TypeId est une propriété d’un Atsortingbute et, comme attr est un T il doit s’agir d’un type hérité de Atsortingbute .

Les contraintes peuvent également être utilisées sur des méthodes génériques, avec le même effet:

 public static void GetTypeId(T attr) where T : Atsortingbute { return attr.TypeId.ToSsortingng(); } 

Il y a d’autres contraintes que vous pouvez placer sur un type; de MSDN :

where T: struct

L’argument type doit être un type valeur. Tout type de valeur sauf Nullable peut être spécifié.

where T : class

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.

where T : new()

L’argument type doit avoir un constructeur public sans paramètre. Lorsqu’elle est utilisée avec d’autres contraintes, la contrainte new () doit être spécifiée en dernier.

where T :

L’argument de type doit être ou dériver de la classe de base spécifiée.

where T :

L’argument type doit être ou implémenter l’interface spécifiée. Plusieurs contraintes d’interface peuvent être spécifiées. L’interface contraignante peut aussi être générique.

where T : U

L’argument de type fourni pour T doit être dérivé de l’argument fourni pour U. Il s’agit d’une contrainte de type nue.

En plus de ce que les autres ont dit, vous avez également les éléments suivants:

  • new () – T doit avoir le constructeur par défaut
  • classe – T doit être un type de référence
  • struct – T doit être un type de valeur

C’est une façon de restreindre le type utilisé comme argument générique. Alors:

 where T : SomeType 

Signifie que T doit dériver de SomeType ou implémenter l’interface SomeType

La clause where est utilisée pour limiter les arguments pouvant être passés lors de l’utilisation de génériques. Lorsque vous créez une classe générique, il peut être dans votre intérêt de spécifier un type d’argument en fonction de la manière dont vous prévoyez d’utiliser T dans votre classe. Si autre que ce que System.Object peut faire, il est probablement préférable d’utiliser une contrainte, car vous obtiendrez une erreur de compilation lors d’un runtime.

Exemple

Si vous créez une classe

 class Person where T : System.IComparable { //can now use CompareTo } 

Vous ne pouvez pas transmettre à cette classe quoi que ce soit qui n’implémente pas IComparable. Donc, il est maintenant sûr d’utiliser CompareTo sur tout ce qui est passé dans la classe Person.