Comment résoudre l’opérateur ‘! =’ Ne peut pas être appliqué aux opérandes de type ‘T’ et ‘T’

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