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?
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;
}
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;
}
}
}
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).