none
Generics : impossible d'appliquer l'opérateur '=='

    Question

  • Bonjour,

    Le code ci dessous affiche l'erreur 'Impossible d'appliquer l'opérateur '==' aux opérandes de type T et T'.

    Cette erreur disparaît si je met une contrainte type 'class MyClass<T> where T : class' mais je veux garder un type générique, pas forcément nullable.

    Quelle contrainte dois-je ajouter à la déclaration pour que l'opérateur '==' soit accepté?

    Cordialement

     class MyClass<T> {
            public T Value;
    
            public bool IsDefault() {
                return Value == default(T);
            }
        }


    dimanche 11 juin 2017 21:36

Réponses

  • Bonjour,

    Je mettrais : return Value.Equals(default(T));

      
    class MyClass<T>
    {
        public T Value;
     
        public bool IsDefault()
        {
            if(Value == null && default(T) == null)
            {
                return true;
            }
            else if(Value == null)
            {
                return false;
            }
     
            return Value.Equals(default(T));
        }
    }
    

    Cordialement,

    Dimitri



    lundi 12 juin 2017 06:56
  • Je viens de trouver une solution possible:

     class MyClass<T> {
            public T Value;
    
            public bool IsDefault() {
               Equals(Value, default(T));
            }
        }

    En fait le compilateur refuse == car on ne peut être certain que l'opérateur == est surchargé pour le type T.

    Il me semblait que l'on pouvait ajouter une contrainte à la déclaration de la classe "class MyClass<T> where T: ..." qui spécifie que T doit surcharger cet opérateur mais je n'ai pas trouvé si une telle contrainte pouvait être spécifiée.

    lundi 12 juin 2017 17:35

Toutes les réponses

  • Bonjour,

    Je mettrais : return Value.Equals(default(T));

      
    class MyClass<T>
    {
        public T Value;
     
        public bool IsDefault()
        {
            if(Value == null && default(T) == null)
            {
                return true;
            }
            else if(Value == null)
            {
                return false;
            }
     
            return Value.Equals(default(T));
        }
    }
    

    Cordialement,

    Dimitri



    lundi 12 juin 2017 06:56
  • Merci Dimitri,

    Je comprends l'esprit (en ajoutant un else avant le dernier return). 

    Par contre je ne comprend pas bien pourquoi le compilateur refuse de comparer avec une valeur de type T avec default de T... et qu'il faille plusieurs lignes de code pour le faire.

    Cordialement

    lundi 12 juin 2017 16:38
  • Je viens de trouver une solution possible:

     class MyClass<T> {
            public T Value;
    
            public bool IsDefault() {
               Equals(Value, default(T));
            }
        }

    En fait le compilateur refuse == car on ne peut être certain que l'opérateur == est surchargé pour le type T.

    Il me semblait que l'on pouvait ajouter une contrainte à la déclaration de la classe "class MyClass<T> where T: ..." qui spécifie que T doit surcharger cet opérateur mais je n'ai pas trouvé si une telle contrainte pouvait être spécifiée.

    lundi 12 juin 2017 17:35