web-dev-qa-db-fra.com

Comment résoudre Operator '! =' 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 => _Value;
        set
        {
            if (_Value != value)
                _Value = value;
        }
    }
    private int _Value;
}

Lorsque int est remplacé par le générique T, 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 y a-t-il un moyen de le résoudre?

96
Darf
using System.Collections.Generic;

public class Test<T>
{
    public T Value
    {
         get => _Value; 
         set
         {
            // operator== is undefined for generic T; EqualityComparer solves this
            if (!EqualityComparer<T>.Default.Equals(_Value, value))
            {
                _Value = value;
            }
         }
    }
    private T _Value;
}
132
Mehrdad

T est un argument de type et peut être un class ou un struct. Ainsi, le compilateur ne vous laissera pas effectuer des actions qui n'existent pas dans les classes et les structures.

les structures n'ont pas les == et! = par défaut (mais peuvent être ajoutées), c'est pourquoi le compilateur se plaint.

Si vous utilisez le mot clé where pour ajouter une contrainte à l'argument type, le compilateur vous permettra d'utiliser ce type\méthode d'interface\opérateurs

contraindre T à être un class

public class Test<T> where T : class
{
     public T Value
     {
         private T _Value;

         get { return _Value; }
         set
         {
             if (_value != value)
                 _Value = value;             
         }
     }
}

Ou utilisez simplement Equals au lieu du == opérateur

public class Test<T>
{
     public T Value
     {
         private T _Value;

         get { return _Value; }
         set
         {
             if (!_value.Equals(value)
                 _Value = value;             
         }
     }
}
80
gdoron

T peut être n'importe quel type. Vous ne pouvez pas utiliser ==/!= sur les structures, à moins que ces opérateurs ne soient définis sur le type (struct).

22
leppie