Selon la documentation de l' ==
opérateur dans MSDN,
Pour les prédéfinis des types de valeur, la opérateur d'égalité (==) retourne vrai si les valeurs de ses opérandes sont égaux, sinon false. Pour les types référence autres que string, == retourne true si ses deux opérandes reportez-vous à la même objet. Pour le type de chaîne, == compare les valeurs des chaînes de caractères. Valeur définie par l'utilisateur les types de surcharge l'opérateur = = (voir opérateur). Donc peut défini par l'utilisateur des types de référence, bien que par défaut == se comporte comme décrit ci-dessus pour les deux prédéfinis et défini par l'utilisateur des types référence.
Alors pourquoi ce bout de code ne parviennent pas à compiler?
void Compare<T>(T x, T y) { return x == y; }
Je reçois le message d'erreur de l'Opérateur '==' ne peut pas être appliquée à des opérandes de type " T " et "T". Je me demande pourquoi, depuis aussi loin que je comprends l' ==
opérateur est prédéfini pour tous les types?
Edit: Merci à tous. Je n'avais pas remarqué au premier abord que la déclaration a propos des types de référence seulement. Je pensais aussi que bit-par-bit de comparaison est fourni pour tous les types de valeur, qui je sais n'est pas correct.
Mais, dans le cas où je suis en utilisant un type de référence, serait l' ==
opérateur prédéfini référence de comparaison, ou d'utiliser la version surchargée de l'opérateur si un type défini?
Edit 2: Par essais et erreurs, nous avons appris que le ==
de l'opérateur utilisera le prédéfinies de référence de comparaison lors de l'utilisation sans restriction de type générique. En fait, le compilateur utilisera la meilleure méthode, il peut trouver de l'restreinte type d'argument, mais ne cherchez pas plus loin. Par exemple, le code ci-dessous est toujours imprimé true
, même lorsqu' Test.test<B>(new B(), new B())
s'appelle:
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); } }