142 votes

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 { return _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?

196voto

Mehrdad Points 70493
using System.Collections.Generic;

public class Test<T>
{
     public T Value
     {
         get { return _Value; }
         set
         {
             if (!EqualityComparer<T>.Default.Equals(_Value, value))
             {
                 _Value = value;
             }
         }
     }
     private T _Value;
}

112voto

gdoron Points 61066

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

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

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

contraindre T 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 tout simplement utiliser Equals , au lieu de l' == de l'opérateur

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

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

28voto

leppie Points 67289

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X