Réponse courte:
L'égalité est compliqué.
Réponse détaillée:
Primitives types de remplacer la base object.Equals(object)
et retourne true si le texte de l'encadré object
est du même type et de la valeur. (Notez que cela fonctionne également pour les types nullables; non-null types nullables toujours à cocher pour une instance du type sous-jacent.)
Depuis newAge
est short
, son Equals(object)
méthode ne renvoie vrai si vous passez d'une boîte courte avec la même valeur. Vous êtes de passage un coffret int
, elle retourne false.
En revanche, l' ==
opérateur est défini comme la prise de deux int
s (ou short
s ou long
s).
Lorsque vous appelez avec un int
et short
, le compilateur va convertir implicitement l' short
de int
et de comparer l'résultant int
s par valeur.
D'autres moyens de faire fonctionner
Les types primitifs ont aussi leur propre Equals()
méthode qui accepte du même type.
Si vous écrivez age.Equals(newAge)
, le compilateur choisira int.Equals(int)
comme le meilleur de surcharge et de convertir implicitement short
de int
. Puis, il retournera true
, étant donné que cette méthode compare simplement le int
s directement.
short
a également un short.Equals(short)
méthode, mais int
ne peut pas être implicitement converti short
, de sorte que vous ne sont pas en l'appelant.
Vous pourraient le forcer à appeler cette méthode avec un plâtre:
Console.WriteLine(newAge.Equals((short)age)); // true
Cela appellera short.Equals(short)
directement, sans la boxe. Si age
est supérieure à 32767, il va lever une exception de dépassement de capacité.
Vous pouvez aussi appeler l' short.Equals(object)
de surcharge, mais explicitement passer un coffret de l'objet afin qu'il soit du même type:
Console.WriteLine(newAge.Equals((object)(short)age)); // true
Comme lors de la visualisation alternative, cela permettra de jeter un dépassement de capacité si elle ne rentre pas dans un short
.
Contrairement à la solution précédente, il sera de la boîte de l' short
dans un objet, de perdre du temps et de la mémoire.
Code Source:
Voici les deux Equals()
méthodes du code source:
public override bool Equals(Object obj) {
if (!(obj is Int16)) {
return false;
}
return m_value == ((Int16)obj).m_value;
}
public bool Equals(Int16 obj)
{
return m_value == obj;
}
Pour En Savoir Plus:
Voir Eric Lippert.