Selon la documentation de l' ==
opérateur dans MSDN ,
Pour les types de valeurs prédéfinis, l'opérateur d'égalité (==) renvoie true si les valeurs de ses opérandes sont égales, false sinon. Pour les types de référence autres que chaîne, == renvoie true si ses deux opérandes font référence au même objet. Pour le type de chaîne, == compare les valeurs des chaînes. Les types de valeurs définis par l'utilisateur peuvent surcharger l'opérateur == (voir opérateur). Il en va de même pour les types de référence définis par l'utilisateur, bien que par défaut == se comporte comme décrit ci-dessus pour les types de référence prédéfinis et définis par l'utilisateur.
Alors pourquoi cet extrait de code ne parvient-il pas à être compilé?
bool Compare<T>(T x, T y) { return x == y; }
J'obtiens l'erreur Operator '==' ne peut pas être appliqué aux opérandes de type 'T' et 'T' . Je me demande pourquoi, dans la mesure où je comprends l' ==
opérateur est prédéfini pour tous les types?
Edit: Merci à tous. Je n'ai pas remarqué au début que la déclaration concernait uniquement les types de référence. J'ai également pensé que la comparaison bit par bit est fournie pour tous les types de valeur, ce que je sais maintenant n'est pas correct.
Mais, dans le cas où j'utilise un type de référence, l' ==
opérateur utiliserait-il la comparaison de référence prédéfinie, ou utiliserait-il la version surchargée de l'opérateur si un type en définissait un?
Edit 2: Par essais et erreurs, nous avons appris que l' ==
opérateur utilisera la comparaison de référence prédéfinie lors de l'utilisation d'un type générique sans restriction. En fait, le compilateur utilisera la meilleure méthode qu'il puisse trouver pour l'argument de type restreint, mais ne cherchera pas plus loin. Par exemple, le code ci-dessous sera toujours imprimé true
, même lorsqu'il Test.test<B>(new B(), new B())
est appelé:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
==
n'est pas autorisé entre deux opérandes du même type. Cela est vrai pour les struct
types (sauf les types "prédéfinis") qui ne surchargent pas le operator ==
. Comme exemple simple, essayez ceci:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
, alors vous ne pouvez pas vérifier kvp1 == kvp2
car KeyValuePair<,>
est une structure, ce n'est pas un type prédéfini C # et il ne surcharge pas le operator ==
. Pourtant, un exemple est donné par var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
lequel vous ne pouvez pas faire e1 == e2
(ici nous avons la structure imbriquée List<>.Enumerator
(appelée "List`1+Enumerator[T]"
par le runtime) qui ne surcharge pas ==
).
bool
d'un void
...