Ci-dessous est un programme de test simple qui jette un StackOverflowException
quand Equals
est appelé. Je m'attendais au générique Equals
que j'ai reçu de l'objet pour appeler mon IEquatable<MyClass>.Equals
, mais ce n'est pas le cas, il s'appelle à la place. Pourquoi? Le type de paramètre semble correct. Pourquoi appelle-t-il la version générique en premier lieu? Je suis confus.Pourquoi une exception de dépassement de pile est-elle générée?
using System;
namespace consapp
{
class Program
{
static void Main(string[] args)
{
MyClass x0 = new MyClass("x0");
MyClass x1 = new MyClass("x");
Console.WriteLine(x1.Equals(x0));
}
}
internal class MyClass : IEquatable<MyClass>
{
public string Name { get; set; }
public MyClass(string s) { this.Name = s; }
public override bool Equals(object x) { return this.Equals(x as MyClass); }
public override int GetHashCode() { return this.Name.ToLowerInvariant().GetHashCode(); }
bool IEquatable<MyClass>.Equals(MyClass x) { return x != null && this.Name == x.Name; }
}
}
Un problème que je vois est que vous n'avez pas défini la propriété Name dans la classe MyClass. Définissez une variable membre pour stocker une chaîne représentant un nom, puis obtenez/définissez-la à l'aide de la propriété Name. – Bernard
D'un côté, vous n'avez probablement pas besoin de surcharger explicitement IEquatable; il surchargera juste bien avec la version d'Object et vous voudrez généralement exposer les Equals plus spécifiques pour des clients de votre classe. –
@Dan: je ne suis pas sûr de ce que vous voulez dire. Je comprends la première partie où vous dites que je peux utiliser mon objet outrepassent l'implémentation comme implémentation IEquatable aussi, mais je ne comprends pas ce que vous voulez dire après cela. la deuxième partie semble contredire le début de la phrase :) – akonsu