Cet extrait de code fonctionne comme prévu pour le type int
:
public class Test { public int Value { get { return _Value; } set { if (_Value != value) { _Value = value; } } } private int _Value; }
Lorsque int
est remplacé par le T
générique, le compilateur se plaint de:
L’opérateur ‘! =’ Ne peut pas être appliqué aux opérandes de type ‘T’ et ‘T’
Pourquoi cela se produit-il et existe-t-il un moyen de le résoudre?
using System.Collections.Generic; public class Test { public T Value { get { return _Value; } set { // operator== is undefined for generic T; EqualityComparer solves this if (!EqualityComparer .Default.Equals(_Value, value)) { _Value = value; } } } private T _Value; }
T
est un argument de type et peut être une class
ou une struct
. Ainsi, le compilateur ne vous laissera pas effectuer des actions qui n’existent pas dans les classes et les structures.
Les structs n’ont pas le == et! = par défaut (mais peuvent être ajoutés), c’est pourquoi le compilateur se plaint.
Si vous utilisez le mot-clé where
pour append une contrainte à l’argument de type, le compilateur vous permettra d’utiliser ce type \ interface méthode \ operators
contraindre T
à être une class
public class Test where T : class { public T Value { private T _Value; get { return _Value; } set { if (_value != value) _Value = value; } } }
Ou utilisez simplement Equals
au lieu de l’opérateur ==
public class Test { public T Value { private T _Value; get { return _Value; } set { if (!_value.Equals(value) _Value = value; } } }
T
peut être n’importe quel type. Vous ne pouvez pas utiliser ==
/ !=
Sur des structures, à moins que ces opérateurs ne soient définis sur le type (struct).