Quelle est la différence entre == et Equals() pour les primitives en C#?

Considérer ce code:

int age = 25;
short newAge = 25;
Console.WriteLine(age == newAge);  //true
Console.WriteLine(newAge.Equals(age)); //false
Console.ReadLine();

Les deux int et short sont les types primitifs, mais une comparaison avec == retourne true et une comparaison avec Equals renvoie la valeur false.

Pourquoi?

  • Veuillez Réfléchir à la question et ensuite voter pour fermer
  • C'est le manque évident inverse tentative: Console.WriteLine(age.Equals(newAge));
  • Les deux questions peuvent être répondues par la même explication de la façon dont les deux syntaxes diffèrent dans la sémantique. Si vous vous sentez d'ailleurs, les titres des questions qui doit être changé.
  • Le double ne permet pas d'expliquer ce comportement; c'est à peu près ce que Equals() est en général.
  • cette question n'est pas en double
  • J'ai répondu à cette question exacte sur le Coverity blog il y a quelques jours. blog.coverity.com/2014/01/13/inconsistent-equality
  • Ce qui se passe avec age.Equals(newAge);?
  • Il n'y a pas de notion de "types primitifs" en C#, et même si elle existait, il serait hors de propos. C'est à propos de la surcharge de == et dominante Equals pour obtenir la valeur de référence de la sémantique.
  • Je ne suis pas sûr de savoir comment connexes, c'est à cette question, mais double.NaN n'est pas ==-égal à lui-même, mais il ne Equals lui-même.
  • ReSharper dit: Suspicion de comparaison: il n'y a pas de type dans la solution qui est hérité des deux "court" et "int"
  • La spécification utilise le terme de "types primitifs" à deux reprises, sans jamais la définir; la conséquence en est que les types primitifs sont intégrés dans les types de valeur, mais ce n'est jamais clair. Je l'ai recommandé à Mads que le terme simplement être rayé de la spécification comme il semble créer plus de confusion qu'il supprime.
  • Voir: stackoverflow.com/a/2111905
  • Savez-vous à propos de C#?
  • Qu'est-ce que liées entre boxing et unboxing et cette question?
  • C# à la différence de Java, n'ont pas réellement de Primitives. Les numéros etc sont le type de Référence (pour utiliser java termes). La plupart des choses que Java serait appelé Primitives sont en C#, juste des types qui implémentent IConvertible, IComparable<T>, IEquatable<T> je pense que la chose importante ici est la IEquatable<T> interface (et les règles et les conventions autour d'elle.)
  • Complètement faux. Les numéros en C# sont des types valeur, et peut être mis en boîte à object, qui est à l'origine du problème ici. Cela n'a rien à voir avec IEquatable<T>.
  • C# v1033 Spec, Page 1: C# has a unified type system. All C# types, including primitive types such as int and double, inherit from a single root object type. Thus, all types share a set of common operations, and values of any type can be stored, transported, and *operated upon in a consistent manner.* Le mot Primitif est mentionné qu'une seule autre fois dans la spec, page 361 (paraphased pour le contexte) "Primitive" [sic] types are implemented as structs Pour toutes fins utiles, le mot primitif n'a pas de sens dans le langage C#. La question peut effectivement se rapportent à structs si
  • Oui (voir Eric Lippert du commentaire), mais les types de valeur ne sont pas les types de référence (sauf en boîte). Bien que cette question allait encore se faire avec les types de référence trop.
  • Désolé je manque interpretted "Complètement faux", Vous avez raison, des chiffres, etc sont des types de Valeur, pas de refernce types (my bad). Parce qu'ils sont des structures. Peut-être que la question devrait être editted-à-dire value types au lieu de "primitives". Mon problème est que le primitve mot ne doit pas être utilisé ici.
  • Ce n'est pas en fait une réplique de l'une de ces questions. Par exemple, ce comportement est complètement indépendant de la boxe.
  • Une bonne raison pour laquelle ce est balisé javascript?